From b45b6380e6e368f36de5f9feeaa15d03a18186c1 Mon Sep 17 00:00:00 2001 From: Bedram Tamang Date: Sat, 25 Apr 2026 13:20:21 -0700 Subject: [PATCH] =?UTF-8?q?chore:=20reset=20fastapi=5Fstartkit/=20to=20mai?= =?UTF-8?q?n=20=E2=80=94=20example-only=20branch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- fastapi_startkit/pyproject.toml | 14 +- .../src/fastapi_startkit/application.py | 43 +- .../fastapi_startkit/collection/collection.py | 21 +- .../commands/publish_command.py | 11 +- .../src/fastapi_startkit/config/app.py | 12 +- .../fastapi_startkit/config/facades/config.py | 5 +- .../configuration/Configuration.py | 12 +- .../configuration/__init__.py | 2 +- .../providers/ConfigurationProvider.py | 1 + .../src/fastapi_startkit/console.py | 2 - .../fastapi_startkit/container/container.py | 69 ++- .../environment/environment.py | 3 +- .../fastapi_startkit/exceptions.backup/DD.py | 1 + .../exceptions.backup/ExceptionHandler.py | 12 +- .../exceptions.backup/__init__.py | 50 +-- .../exceptionite/controllers.py | 2 +- .../handlers/DumpExceptionHandler.py | 4 +- .../handlers/HttpExceptionHandler.py | 4 +- .../handlers/ModelNotFoundHandler.py | 4 +- .../fastapi_startkit/exceptions/__init__.py | 44 +- .../fastapi_startkit/exceptions/handler.py | 8 +- .../src/fastapi_startkit/facades/Auth.pyi | 2 +- .../src/fastapi_startkit/facades/Config.pyi | 1 + .../src/fastapi_startkit/facades/Dump.pyi | 2 +- .../src/fastapi_startkit/facades/Facade.py | 1 - .../src/fastapi_startkit/facades/Gate.pyi | 5 +- .../src/fastapi_startkit/facades/Hash.pyi | 4 +- .../src/fastapi_startkit/facades/Loader.pyi | 8 +- .../src/fastapi_startkit/facades/Mail.pyi | 2 +- .../fastapi_startkit/facades/Notification.pyi | 2 +- .../fastapi_startkit/facades/RateLimiter.pyi | 6 +- .../src/fastapi_startkit/facades/Request.pyi | 2 +- .../src/fastapi_startkit/facades/View.pyi | 5 +- .../src/fastapi_startkit/facades/Vite.py | 2 +- .../src/fastapi_startkit/facades/Vite.pyi | 3 +- .../src/fastapi_startkit/facades/__init__.py | 28 +- .../src/fastapi_startkit/fastapi/__init__.py | 4 +- .../fastapi/commands/serve_command.py | 26 +- .../fastapi/providers/fastapi_provider.py | 41 +- .../src/fastapi_startkit/helpers/dataclass.py | 3 +- .../src/fastapi_startkit/helpers/string.py | 10 +- .../src/fastapi_startkit/inertia/__init__.py | 8 +- .../src/fastapi_startkit/inertia/inertia.py | 219 +++------- .../fastapi_startkit/inertia/middleware.py | 130 ++---- .../src/fastapi_startkit/inertia/provider.py | 9 +- .../src/fastapi_startkit/loader/Loader.py | 11 +- .../logging/ChannelFactory.py | 16 +- .../src/fastapi_startkit/logging/__init__.py | 5 +- .../logging/channels/BaseChannel.py | 21 +- .../logging/channels/DailyChannel.py | 17 +- .../logging/channels/MultiBaseChannel.py | 22 +- .../logging/channels/SingleChannel.py | 13 +- .../logging/channels/SlackChannel.py | 20 +- .../logging/channels/StackChannel.py | 10 +- .../logging/channels/SyslogChannel.py | 15 +- .../logging/channels/TerminalChannel.py | 12 +- .../logging/channels/__init__.py | 10 +- .../logging/config/__init__.py | 2 +- .../logging/config/channels.py | 41 +- .../logging/config/logging.py | 29 +- .../logging/drivers/BaseDriver.py | 21 +- .../logging/drivers/LogSingleDriver.py | 55 ++- .../logging/drivers/LogSlackDriver.py | 92 ++-- .../logging/drivers/LogSyslogDriver.py | 17 +- .../logging/drivers/LogTerminalDriver.py | 43 +- .../logging/drivers/__init__.py | 4 +- .../src/fastapi_startkit/logging/factory.py | 15 +- .../src/fastapi_startkit/logging/handler.py | 1 - .../src/fastapi_startkit/logging/listeners.py | 10 +- .../src/fastapi_startkit/logging/logger.py | 5 +- .../logging/managers/LoggingManager.py | 1 - .../logging/managers/__init__.py | 2 +- .../logging/providers/log_provider.py | 24 +- .../masoniteorm.backup/__init__.py | 2 +- .../masoniteorm.backup/config.py | 19 +- .../masoniteorm.backup/config/database.py | 10 +- .../masoniteorm.backup/factories/Factory.py | 4 +- .../masoniteorm.backup/schema/Schema.py | 52 ++- .../scopes/SoftDeleteScope.py | 16 +- .../scopes/UUIDPrimaryKeyScope.py | 10 +- .../testing/BaseTestCaseSelectGrammar.py | 398 ++++++++++++++---- .../masoniteorm.backup/testing/Database.py | 12 +- .../masoniteorm.backup/testing/TestCase.py | 2 - .../masoniteorm.backup/testing/__init__.py | 2 +- .../masoniteorm.backup/tests/User.py | 2 +- .../tests/collection/test_collection.py | 31 +- .../tests/commands/test_shell.py | 10 +- .../tests/eagers/test_eager.py | 32 +- .../tests/factories/test_factories.py | 4 +- .../tests/integrations/config/database.py | 1 + .../2026_01_01_000000_create_users_table.py | 1 - .../tests/integrations/model.py | 16 +- .../tests/integrations/test_model.py | 5 +- .../tests/models/test_models.py | 70 ++- .../mssql/builder/test_mssql_query_builder.py | 63 ++- .../test_mssql_query_builder_relationships.py | 5 +- .../grammar/test_mssql_delete_grammar.py | 12 +- .../grammar/test_mssql_insert_grammar.py | 4 +- .../grammar/test_mssql_select_grammar.py | 43 +- .../grammar/test_mssql_update_grammar.py | 13 +- .../mssql/schema/test_mssql_schema_builder.py | 10 +- .../schema/test_mssql_schema_builder_alter.py | 14 +- .../builder/test_mysql_builder_transaction.py | 4 +- .../tests/mysql/builder/test_query_builder.py | 243 ++++++++--- .../builder/test_query_builder_scopes.py | 14 +- .../grammar/test_mysql_delete_grammar.py | 24 +- .../grammar/test_mysql_insert_grammar.py | 24 +- .../tests/mysql/grammar/test_mysql_qmark.py | 50 ++- .../grammar/test_mysql_select_grammar.py | 43 +- .../grammar/test_mysql_update_grammar.py | 35 +- .../model/test_accessors_and_mutators.py | 8 +- .../tests/mysql/model/test_model.py | 60 ++- .../relationships/test_belongs_to_many.py | 27 +- .../relationships/test_has_many_through.py | 10 +- .../relationships/test_has_one_through.py | 10 +- .../mysql/relationships/test_relationships.py | 37 +- .../mysql/schema/test_mysql_schema_builder.py | 44 +- .../schema/test_mysql_schema_builder_alter.py | 36 +- .../scopes/test_can_use_global_scopes.py | 4 +- .../tests/mysql/scopes/test_can_use_scopes.py | 4 +- .../tests/mysql/scopes/test_soft_delete.py | 4 +- .../builder/test_postgres_query_builder.py | 211 +++++++--- .../postgres/grammar/test_delete_grammar.py | 20 +- .../postgres/grammar/test_insert_grammar.py | 20 +- .../postgres/grammar/test_select_grammar.py | 41 +- .../postgres/grammar/test_update_grammar.py | 39 +- .../schema/test_postgres_schema_builder.py | 29 +- .../test_postgres_schema_builder_alter.py | 20 +- .../scopes/test_default_global_scopes.py | 1 + .../builder/test_sqlite_query_builder.py | 266 +++++++++--- ...test_sqlite_query_builder_relationships.py | 9 +- .../grammar/test_sqlite_delete_grammar.py | 19 +- .../grammar/test_sqlite_insert_grammar.py | 24 +- .../grammar/test_sqlite_select_grammar.py | 38 +- .../grammar/test_sqlite_update_grammar.py | 35 +- ...st_sqlite_has_many_through_relationship.py | 90 ++-- ...est_sqlite_has_one_through_relationship.py | 108 ++--- .../relationships/test_sqlite_polymorphic.py | 66 +-- .../schema/test_sqlite_schema_builder.py | 23 +- .../test_sqlite_schema_builder_alter.py | 20 +- .../tests/sqlite/schema/test_table.py | 6 +- .../fastapi_startkit/masoniteorm/__init__.py | 2 +- .../masoniteorm/commands/DBMigrateCommand.py | 15 +- .../masoniteorm/commands/DBSeedCommand.py | 6 +- .../masoniteorm/commands/Entry.py | 4 +- .../commands/MakeMigrationCommand.py | 12 +- .../masoniteorm/commands/MakeModelCommand.py | 31 +- .../commands/MakeModelDocstringCommand.py | 9 +- .../commands/MakeObserverCommand.py | 18 +- .../masoniteorm/commands/MakeSeedCommand.py | 16 +- .../commands/MigrateFreshCommand.py | 3 - .../commands/MigrateRefreshCommand.py | 7 +- .../commands/MigrateResetCommand.py | 7 +- .../commands/MigrateRollbackCommand.py | 11 +- .../commands/MigrateStatusCommand.py | 6 +- .../masoniteorm/commands/ShellCommand.py | 33 +- .../masoniteorm/commands/__init__.py | 4 +- .../masoniteorm/config/config.py | 8 +- .../masoniteorm/config/database.py | 26 +- .../masoniteorm/connections/connection.py | 22 +- .../masoniteorm/connections/factory.py | 29 +- .../masoniteorm/connections/manager.py | 7 +- .../connections/postgres_connection.py | 7 +- .../connections/sqlite_connection.py | 2 - .../masoniteorm/expressions/expressions.py | 21 +- .../masoniteorm/facades/DB.py | 5 +- .../masoniteorm/facades/Schema.py | 7 +- .../masoniteorm/factory/factory.py | 126 +----- .../masoniteorm/helpers/misc.py | 4 +- .../masoniteorm/migrations/Migration.py | 105 +++-- .../masoniteorm/models/MigrationModel.py | 1 - .../masoniteorm/models/__init__.py | 2 +- .../masoniteorm/models/attribute.py | 18 +- .../masoniteorm/models/builder.py | 116 ++--- .../masoniteorm/models/caster.py | 28 +- .../masoniteorm/models/fields.py | 10 +- .../masoniteorm/models/model.py | 25 +- .../masoniteorm/models/observer.py | 5 +- .../masoniteorm/models/relationship.py | 2 + .../masoniteorm/observers/ObservesEvents.py | 2 +- .../pagination/LengthAwarePaginator.py | 4 +- .../masoniteorm/pagination/SimplePaginator.py | 4 +- .../masoniteorm/providers/DatabaseProvider.py | 41 +- .../masoniteorm/providers/__init__.py | 2 +- .../masoniteorm/query/EagerRelation.py | 4 +- .../masoniteorm/query/grammars/BaseGrammar.py | 143 +++++-- .../query/grammars/MySQLGrammar.py | 12 +- .../query/processors/MSSQLPostProcessor.py | 4 +- .../query/processors/MySQLPostProcessor.py | 4 +- .../query/processors/SQLitePostProcessor.py | 4 +- .../masoniteorm/query/support.py | 5 +- .../relationships/BaseRelationship.py | 44 +- .../masoniteorm/relationships/BelongsTo.py | 11 +- .../relationships/BelongsToMany.py | 104 +++-- .../masoniteorm/relationships/HasMany.py | 10 +- .../relationships/HasManyThrough.py | 73 ++-- .../masoniteorm/relationships/HasOne.py | 11 +- .../relationships/HasOneThrough.py | 75 ++-- .../masoniteorm/relationships/MorphMany.py | 16 +- .../masoniteorm/relationships/MorphOne.py | 16 +- .../masoniteorm/relationships/MorphTo.py | 11 +- .../masoniteorm/relationships/MorphToMany.py | 10 +- .../masoniteorm/schema/Blueprint.py | 198 ++++++--- .../masoniteorm/schema/Table.py | 8 +- .../masoniteorm/schema/TableDiff.py | 4 +- .../schema/platforms/MSSQLPlatform.py | 87 ++-- .../schema/platforms/MySQLPlatform.py | 134 ++++-- .../masoniteorm/schema/platforms/Platform.py | 20 +- .../schema/platforms/PostgresPlatform.py | 125 ++++-- .../schema/platforms/SQLitePlatform.py | 105 +++-- .../masoniteorm/schema/schema.py | 1 + .../masoniteorm/seeds/Seeder.py | 10 +- .../masoniteorm/tests/fixtures/db.py | 17 +- .../masoniteorm/tests/fixtures/factory.py | 11 +- .../masoniteorm/tests/fixtures/migration.py | 27 +- .../masoniteorm/tests/fixtures/model.py | 21 +- .../masoniteorm/tests/fixtures/seeder.py | 8 +- .../masoniteorm/tests/models/test_model.py | 9 +- .../tests/models/test_model_attributes.py | 36 +- .../tests/sqlite/models/test_sqlite_model.py | 6 +- .../test_sqlite_relationships.py | 7 +- .../masoniteorm/tests/sqlite/test_case.py | 2 +- .../fastapi_startkit/providers/Provider.py | 19 +- .../providers/app_provider.py | 4 +- .../tests/configurations/test_config_merge.py | 34 +- .../src/fastapi_startkit/tests/test_case.py | 3 +- .../src/fastapi_startkit/utils/collections.py | 7 +- .../src/fastapi_startkit/utils/filesystem.py | 4 +- .../src/fastapi_startkit/utils/http.py | 1 + .../src/fastapi_startkit/utils/location.py | 3 +- .../src/fastapi_startkit/utils/str.py | 10 +- .../src/fastapi_startkit/utils/structures.py | 10 +- .../src/fastapi_startkit/utils/time.py | 1 - .../src/fastapi_startkit/vite/__init__.py | 4 +- .../src/fastapi_startkit/vite/config/vite.py | 4 + .../src/fastapi_startkit/vite/exceptions.py | 2 +- .../vite/providers/provider.py | 16 +- .../src/fastapi_startkit/vite/vite.py | 114 ++--- fastapi_startkit/uv.lock | 29 +- 239 files changed, 3993 insertions(+), 2488 deletions(-) diff --git a/fastapi_startkit/pyproject.toml b/fastapi_startkit/pyproject.toml index 4e2a062e..89d7cfdb 100644 --- a/fastapi_startkit/pyproject.toml +++ b/fastapi_startkit/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "fastapi-startkit" -version = "0.13.7" +version = "0.13.6" description = "Fastapi Starter kit components" authors = [ {name = "Bedram Tamang", email = "tmgbedu@gmail.com"} @@ -46,7 +46,6 @@ dev = [ "dumpdie>=1.5.0", "pytest>=9.0.3", "pytest-asyncio>=1.3.0", - "ruff>=0.15.12", "twine>=6.2.0", ] @@ -60,14 +59,3 @@ build-backend = "uv_build" [tool.uv] workspace = { members = ["application", "example/*"] } - -[tool.ruff] -line-length = 120 - -[tool.ruff.lint] -select = ["E", "F", "I"] -ignore = ["E501"] -fixable = ["ALL"] - -[tool.ruff.lint.per-file-ignores] -"__init__.py" = ["F401"] diff --git a/fastapi_startkit/src/fastapi_startkit/application.py b/fastapi_startkit/src/fastapi_startkit/application.py index 85e62afb..5ad38d6b 100644 --- a/fastapi_startkit/src/fastapi_startkit/application.py +++ b/fastapi_startkit/src/fastapi_startkit/application.py @@ -1,27 +1,26 @@ import os from pathlib import Path -from typing import TYPE_CHECKING, Any, Callable, Generic, List, Optional, Type, TypeVar +from typing import TYPE_CHECKING, Optional +from typing import Type, Callable, Any, List, TypeVar, Generic from fastapi_startkit.providers.app_provider import AppProvider - from .config import AppConfig from .configuration.providers import ConfigurationProvider from .container import Container from .environment.environment import LoadEnvironment if TYPE_CHECKING: - from fastapi import APIRouter, FastAPI + from fastapi import FastAPI, APIRouter from starlette.middleware.base import BaseHTTPMiddleware from fastapi_startkit.exceptions import ExceptionHandler -def app() -> "Container": +def app() -> 'Container': return Container.instance() -TConfig = TypeVar("TConfig", bound=AppConfig) - +TConfig = TypeVar('TConfig', bound=AppConfig) class Application(Container, Generic[TConfig]): DEFAULT_PROVIDERS = [ @@ -29,14 +28,7 @@ class Application(Container, Generic[TConfig]): AppProvider, ] - def __init__( - self, - base_path: str = None, - env=None, - providers=None, - config: Type[TConfig] | None = None, - exception_handler: Type[ExceptionHandler] | None = None, - ): + def __init__(self, base_path: str = None, env=None, providers=None, config: Type[TConfig] | None = None, exception_handler: Type[ExceptionHandler] | None = None): super().__init__() self.base_path: str = base_path or os.getcwd() @@ -75,8 +67,6 @@ def register_providers(self): config = {} if isinstance(provider_data, tuple): provider_class, config = provider_data - if callable(config): - config = config() else: provider_class = provider_data @@ -129,8 +119,9 @@ def include_router(self, router: "APIRouter", **kwargs): return self # Add middleware - def add_middleware(self, middleware_class: type[Any], *args: Any, **kwargs: Any) -> None: - self._fastapi.add_middleware(middleware_class, *args, **kwargs) + def add_middleware(self, middleware_class: Type['BaseHTTPMiddleware'], **options): + self._fastapi.add_middleware(middleware_class, **options) + return self # Add event handlers (startup/shutdown) def add_event_handler(self, event_type: str, func: Callable[..., Any]): @@ -153,7 +144,9 @@ def fastapi(self) -> "FastAPI": try: from fastapi import FastAPI except ImportError: - raise RuntimeError("FastAPI is not installed. Install it with: pip install fastapi") + raise RuntimeError( + "FastAPI is not installed. Install it with: pip install fastapi" + ) self._fastapi = FastAPI() # Making the type hint work assert self._fastapi is not None @@ -166,11 +159,7 @@ def load_environment(self): LoadEnvironment(environment=self.env, base_path=self.base_path) def is_debug(self) -> bool: - return ( - hasattr(self, "_config_instance") - and self._config_instance is not None - and getattr(self._config_instance, "debug", False) - ) + return hasattr(self, '_config_instance') and self._config_instance is not None and getattr(self._config_instance, 'debug', False) def configure_config(self): if self._config is not None: @@ -183,15 +172,15 @@ def config(self) -> TConfig: return self._config_instance def configure_paths(self): - self.bind("config.location", os.path.join(self.base_path, "config")) + self.bind('config.location', os.path.join(self.base_path, "config")) def use_config_path(self, path: str = None): - self.bind("config.location", path) + self.bind('config.location', path) return self def use_storage_path(self, path: str = None): - self.bind("storage.location", path) + self.bind('storage.location', path) return self diff --git a/fastapi_startkit/src/fastapi_startkit/collection/collection.py b/fastapi_startkit/src/fastapi_startkit/collection/collection.py index 84960a6a..0ec7a975 100644 --- a/fastapi_startkit/src/fastapi_startkit/collection/collection.py +++ b/fastapi_startkit/src/fastapi_startkit/collection/collection.py @@ -276,7 +276,9 @@ def pluck(self, value, key=None, keep_nulls=True): if k == value: if key: - attributes[self._data_get(item, key)] = self._data_get(item, value) + attributes[self._data_get(item, key)] = self._data_get( + item, value + ) else: attributes.append(v) @@ -308,7 +310,9 @@ def random(self, count=None): if collection_count == 0: return None elif count and count > collection_count: - raise ValueError("count argument must be inferior to collection length.") + raise ValueError( + "count argument must be inferior to collection length." + ) elif count: self._items = random.sample(self._items, k=count) return self @@ -369,7 +373,10 @@ def val(item, key): return getattr(item, key, None) def sort(self, key=None, reverse=False): - self._items.sort(key=lambda item: self.val(item, key), reverse=reverse) + self._items.sort( + key=lambda item: self.val(item, key), + reverse=reverse + ) return self def sum(self, key=None): @@ -436,7 +443,9 @@ def where(self, key, *args): if isinstance(item, dict): comparison = item.get(key) else: - comparison = getattr(item, key) if hasattr(item, key) else False + comparison = ( + getattr(item, key) if hasattr(item, key) else False + ) if self._make_comparison(comparison, value, op): attributes.append(item) return self.__class__(attributes) @@ -490,7 +499,9 @@ def where_not_in(self, key, args: list) -> "Collection": def zip(self, items): items = self.__get_items(items) if not isinstance(items, list): - raise ValueError("The 'items' parameter must be a list or a Collection") + raise ValueError( + "The 'items' parameter must be a list or a Collection" + ) _items = [] for x, y in zip(self, items): diff --git a/fastapi_startkit/src/fastapi_startkit/commands/publish_command.py b/fastapi_startkit/src/fastapi_startkit/commands/publish_command.py index 89de062b..15da4e67 100644 --- a/fastapi_startkit/src/fastapi_startkit/commands/publish_command.py +++ b/fastapi_startkit/src/fastapi_startkit/commands/publish_command.py @@ -4,7 +4,6 @@ from cleo.commands.command import Command from cleo.helpers import option - from fastapi_startkit.helpers.string import Str if TYPE_CHECKING: @@ -22,7 +21,7 @@ class PublishCommand(Command): def handle(self): from fastapi_startkit.application import app - application: "Application" = app() + application: 'Application' = app() if not application.published_resources: self.line("Nothing to publish.") @@ -33,7 +32,9 @@ def handle(self): if provider_arg: target = Str.slugify(provider_arg) resources = { - name: files for name, files in application.published_resources.items() if Str.slugify(name) == target + name: files + for name, files in application.published_resources.items() + if Str.slugify(name) == target } if not resources: self.line(f"No provider found matching '{provider_arg}'.") @@ -46,9 +47,7 @@ def handle(self): dest_path = application.use_base_path(destination) if os.path.exists(dest_path): - overwrite = self.confirm( - f" {destination} already exists. Overwrite?", default=False - ) + overwrite = self.confirm(f" {destination} already exists. Overwrite?", default=False) if not overwrite: self.line(f" [{provider_key}] Skipped {destination}") continue diff --git a/fastapi_startkit/src/fastapi_startkit/config/app.py b/fastapi_startkit/src/fastapi_startkit/config/app.py index e21b5ec0..976b9c77 100644 --- a/fastapi_startkit/src/fastapi_startkit/config/app.py +++ b/fastapi_startkit/src/fastapi_startkit/config/app.py @@ -1,12 +1,10 @@ import os -from dataclasses import dataclass, field - +from dataclasses import field, dataclass from fastapi_startkit.environment.environment import env - @dataclass class AppConfig: - name: str = field(default_factory=lambda: os.getenv("APP_NAME", "FastAPI starter kit")) - env: str = field(default_factory=lambda: os.getenv("APP_ENV", "development")) - debug: bool = field(default_factory=lambda: env("APP_DEBUG", "true")) - timezone: str = field(default_factory=lambda: os.getenv("APP_TIMEZONE", "UTC")) + name: str = field(default_factory=lambda: os.getenv('APP_NAME', 'FastAPI starter kit')) + env: str = field(default_factory=lambda: os.getenv('APP_ENV', 'development')) + debug: bool = field(default_factory=lambda: env('APP_DEBUG', 'true')) + timezone: str = field(default_factory=lambda: os.getenv('APP_TIMEZONE', 'UTC')) diff --git a/fastapi_startkit/src/fastapi_startkit/config/facades/config.py b/fastapi_startkit/src/fastapi_startkit/config/facades/config.py index 6583e416..e36c130b 100644 --- a/fastapi_startkit/src/fastapi_startkit/config/facades/config.py +++ b/fastapi_startkit/src/fastapi_startkit/config/facades/config.py @@ -1,12 +1,11 @@ -from typing import TYPE_CHECKING, Type, TypeVar +from typing import TypeVar, Type, TYPE_CHECKING if TYPE_CHECKING: from fastapi_startkit.config import AppConfig -TConfig = TypeVar("TConfig", bound="AppConfig") +TConfig = TypeVar('TConfig', bound='AppConfig') def Config(cls: Type[TConfig] | None = None) -> TConfig: from fastapi_startkit.application import app - return app().config # type: ignore[return-value] diff --git a/fastapi_startkit/src/fastapi_startkit/configuration/Configuration.py b/fastapi_startkit/src/fastapi_startkit/configuration/Configuration.py index a4527798..db8bd0bd 100644 --- a/fastapi_startkit/src/fastapi_startkit/configuration/Configuration.py +++ b/fastapi_startkit/src/fastapi_startkit/configuration/Configuration.py @@ -1,7 +1,6 @@ from fastapi_startkit.loader import Loader - -from ..exceptions import InvalidConfigurationSetup from ..utils.structures import data +from ..exceptions import InvalidConfigurationLocation, InvalidConfigurationSetup class Configuration: @@ -27,11 +26,14 @@ def __init__(self, application): def load(self): """At boot load configuration from all files and store them in here.""" config_root = self.application.make("config.location") - for module_name, module in Loader().get_modules(config_root, raise_exception=True).items(): + for module_name, module in Loader().get_modules( + config_root, raise_exception=True + ).items(): params = Loader().get_parameters(module) for name, value in params.items(): self._config[f"{module_name}.{name.lower()}"] = value + def merge_with(self, path, external_config): """Merge external config at key with project config at same key. It's especially useful in Masonite packages in order to merge the configuration default package with @@ -41,7 +43,9 @@ def merge_with(self, path, external_config): (such as 'application'). """ if path in self.reserved_keys: - raise InvalidConfigurationSetup(f"{path} is a reserved configuration key name. Please use an other key.") + raise InvalidConfigurationSetup( + f"{path} is a reserved configuration key name. Please use an other key." + ) if isinstance(external_config, str): # config is a path and should be loaded params = Loader().get_parameters(external_config) diff --git a/fastapi_startkit/src/fastapi_startkit/configuration/__init__.py b/fastapi_startkit/src/fastapi_startkit/configuration/__init__.py index e04bda97..2847ba4f 100644 --- a/fastapi_startkit/src/fastapi_startkit/configuration/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/configuration/__init__.py @@ -1,2 +1,2 @@ -from .Configuration import Configuration from .helpers import config +from .Configuration import Configuration diff --git a/fastapi_startkit/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py b/fastapi_startkit/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py index 2f16c931..772a9e11 100644 --- a/fastapi_startkit/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +++ b/fastapi_startkit/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py @@ -1,4 +1,5 @@ from ...providers import Provider + from ..Configuration import Configuration diff --git a/fastapi_startkit/src/fastapi_startkit/console.py b/fastapi_startkit/src/fastapi_startkit/console.py index a4c8846a..a6266977 100644 --- a/fastapi_startkit/src/fastapi_startkit/console.py +++ b/fastapi_startkit/src/fastapi_startkit/console.py @@ -1,9 +1,7 @@ from cleo.application import Application as BaseApplication from cleo.io.io import IO - from fastapi_startkit.application import Application - class ConsoleApplication(BaseApplication): def __init__(self, app: Application): super().__init__() diff --git a/fastapi_startkit/src/fastapi_startkit/container/container.py b/fastapi_startkit/src/fastapi_startkit/container/container.py index d86e3249..6a8f2231 100644 --- a/fastapi_startkit/src/fastapi_startkit/container/container.py +++ b/fastapi_startkit/src/fastapi_startkit/container/container.py @@ -27,8 +27,9 @@ def instance(cls): raise RuntimeError("Container not initialized") return cls._instance + def __init__(self): - if not hasattr(self, "objects"): + if not hasattr(self, 'objects'): self.objects = {} self.strict = False self.override = True @@ -54,10 +55,14 @@ def bind(self, name, class_obj): """ if inspect.ismodule(class_obj): raise StrictContainerException( - "Cannot bind module '{}' with key '{}' into the container".format(class_obj, name) + "Cannot bind module '{}' with key '{}' into the container".format( + class_obj, name + ) ) if self.strict and name in self.objects: - raise StrictContainerException("You cannot override a key inside a strict container") + raise StrictContainerException( + "You cannot override a key inside a strict container" + ) if self.override or name not in self.objects: self.fire_hook("bind", name, class_obj) @@ -141,7 +146,9 @@ def make(self, name, *arguments): obj = self.resolve(name, *arguments) return obj - raise MissingContainerBindingNotFound("{0} key was not found in the container".format(name)) + raise MissingContainerBindingNotFound( + "{0} key was not found in the container".format(name) + ) def has(self, name): """Check if a key exists in the container. @@ -194,9 +201,14 @@ def resolve(self, obj, *resolving_arguments): self.remember and not passing_arguments and inspect.ismethod(obj) - and "{}.{}.{}".format(obj.__module__, obj.__self__.__class__.__name__, obj.__name__) in self._remembered + and "{}.{}.{}".format( + obj.__module__, obj.__self__.__class__.__name__, obj.__name__ + ) + in self._remembered ): - location = "{}.{}.{}".format(obj.__module__, obj.__self__.__class__.__name__, obj.__name__) + location = "{}.{}.{}".format( + obj.__module__, obj.__self__.__class__.__name__, obj.__name__ + ) objects = self._remembered[location] try: return obj(*objects) @@ -204,13 +216,7 @@ def resolve(self, obj, *resolving_arguments): raise ContainerError(str(e)) else: for _, value in self.get_parameters(obj): - if type(value.annotation) in (str, int, dict, list, tuple) or value.annotation in ( - str, - int, - dict, - list, - tuple, - ): + if type(value.annotation) in (str, int, dict, list, tuple) or value.annotation in (str, int, dict, list, tuple): # Ignore any times a user is simply type hinting a parameter like (parameter:str or parameter:"str"). # In this case we don't want to resolve anything but we do want # to insert any passing arguments we passed in @@ -260,7 +266,9 @@ def resolve(self, obj, *resolving_arguments): if not inspect.ismethod(obj): self._remembered[obj] = objects else: - signature = "{}.{}.{}".format(obj.__module__, obj.__self__.__class__.__name__, obj.__name__) + signature = "{}.{}.{}".format( + obj.__module__, obj.__self__.__class__.__name__, obj.__name__ + ) self._remembered[signature] = objects return obj(*objects) @@ -292,15 +300,20 @@ def collect(self, search): providers.update({key: value}) elif "*" in search: split_search = search.split("*") - if key.startswith(split_search[0]) and key.endswith(split_search[1]): + if key.startswith(split_search[0]) and key.endswith( + split_search[1] + ): providers.update({key: value}) else: - raise AttributeError("There is no '*' in your collection search") + raise AttributeError( + "There is no '*' in your collection search" + ) else: for provider_key, provider_class in self.objects.items(): - if (inspect.isclass(provider_class) and issubclass(provider_class, search)) or isinstance( - provider_class, search - ): + if ( + inspect.isclass(provider_class) + and issubclass(provider_class, search) + ) or isinstance(provider_class, search): providers.update({provider_key: provider_class}) return providers @@ -326,7 +339,10 @@ def _find_annotated_parameter(self, parameter): return obj for _, provider_class in self.objects.items(): - if parameter.annotation == provider_class or parameter.annotation == provider_class.__class__: + if ( + parameter.annotation == provider_class + or parameter.annotation == provider_class.__class__ + ): obj = provider_class self.fire_hook("resolve", parameter, obj) @@ -341,7 +357,9 @@ def _find_annotated_parameter(self, parameter): return obj raise ContainerError( - "The dependency with the {0} annotation could not be resolved by the container".format(parameter) + "The dependency with the {0} annotation could not be resolved by the container".format( + parameter + ) ) def get_parameters(self, obj): @@ -369,7 +387,9 @@ def _find_parameter(self, keyword): return keyword.default raise ContainerError( - "The parameter dependency with the key of {0} could not be found in the container".format(parameter) + "The parameter dependency with the key of {0} could not be found in the container".format( + parameter + ) ) def on_bind(self, key, obj): @@ -429,6 +449,7 @@ def fire_hook(self, action, key, obj): and obj in self._hooks[action] or obj.__class__ in self._hooks[action] ): + for _, hook_list in self._hooks[action].items(): for hook_obj in hook_list: hook_obj(obj, self) @@ -478,7 +499,9 @@ def _find_obj(self, obj): return return_obj raise MissingContainerBindingNotFound( - "The dependency with the {0} annotation could not be resolved by the container".format(obj) + "The dependency with the {0} annotation could not be resolved by the container".format( + obj + ) ) def __contains__(self, obj): diff --git a/fastapi_startkit/src/fastapi_startkit/environment/environment.py b/fastapi_startkit/src/fastapi_startkit/environment/environment.py index 615f20a2..86bfaf69 100644 --- a/fastapi_startkit/src/fastapi_startkit/environment/environment.py +++ b/fastapi_startkit/src/fastapi_startkit/environment/environment.py @@ -2,9 +2,8 @@ import os import sys -from pathlib import Path - from dotenv import load_dotenv +from pathlib import Path class LoadEnvironment: diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/DD.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/DD.py index 0512e7f3..972c8cc9 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/DD.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/DD.py @@ -3,6 +3,7 @@ from .exceptions import DumpException + warnings.warn( "DD class will be removed in Masonite 5. Please use Dump facade instead.", DeprecationWarning, diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py index 43aefb4a..d0036aa6 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py @@ -31,7 +31,9 @@ def handle(self, exception): response = self.application.make("response") request = self.application.make("request") - self.application.make("event").fire(f"masonite.exception.{exception.__class__.__name__}", exception) + self.application.make("event").fire( + f"masonite.exception.{exception.__class__.__name__}", exception + ) # add headers to response if any if hasattr(exception, "get_headers"): @@ -45,13 +47,17 @@ def handle(self, exception): response.with_headers(headers) if self.application.has(f"{exception.__class__.__name__}Handler"): - return self.application.make(f"{exception.__class__.__name__}Handler").handle(exception) + return self.application.make( + f"{exception.__class__.__name__}Handler" + ).handle(exception) # handle exception in production if not self.application.is_debug(): # for HTTP error codes (500, 404, 403...) a specific page should be displayed # if a renderable exception is raised let it be displayed - if hasattr(exception, "is_http_exception") or hasattr(exception, "get_response"): + if hasattr(exception, "is_http_exception") or hasattr( + exception, "get_response" + ): return self.application.make("HttpExceptionHandler").handle(exception) # else fallback to an unknown exception that should be displayed as a 500 error diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/__init__.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/__init__.py index b3c05ef6..590a19b7 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/__init__.py @@ -1,38 +1,38 @@ -from .DD import DD from .ExceptionHandler import ExceptionHandler +from .handlers.DumpExceptionHandler import DumpExceptionHandler +from .handlers.HttpExceptionHandler import HttpExceptionHandler +from .handlers.ModelNotFoundHandler import ModelNotFoundHandler +from .DD import DD from .exceptions import ( - AmbiguousError, AuthorizationException, + InvalidRouteCompileException, + RouteMiddlewareNotFound, ContainerError, - DumpException, - InvalidConfigurationLocation, - InvalidConfigurationSetup, - InvalidCSRFToken, + MissingContainerBindingNotFound, + StrictContainerException, + ResponseError, InvalidHTTPStatusCode, - InvalidPackageName, - InvalidRouteCompileException, + RequiredContainerBindingNotFound, + ViewException, + RouteNotFoundException, + DumpException, InvalidSecretKey, - InvalidToken, - LoaderNotFound, - MethodNotAllowedException, - MissingContainerBindingNotFound, - MixFileNotFound, - MixManifestNotFound, - ModelNotFoundException, + InvalidCSRFToken, NotificationException, + InvalidToken, ProjectLimitReached, - ProjectProviderHttpError, ProjectProviderTimeout, + ProjectProviderHttpError, ProjectTargetNotEmpty, + MixFileNotFound, + MixManifestNotFound, + InvalidConfigurationLocation, + InvalidConfigurationSetup, + InvalidPackageName, + LoaderNotFound, QueueException, - RequiredContainerBindingNotFound, - ResponseError, - RouteMiddlewareNotFound, - RouteNotFoundException, - StrictContainerException, + AmbiguousError, + MethodNotAllowedException, + ModelNotFoundException, ThrottleRequestsException, - ViewException, ) -from .handlers.DumpExceptionHandler import DumpExceptionHandler -from .handlers.HttpExceptionHandler import HttpExceptionHandler -from .handlers.ModelNotFoundHandler import ModelNotFoundHandler diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py index c7d2cca4..35fd676c 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py @@ -1,5 +1,5 @@ -from ...controllers import Controller from ...request import Request +from ...controllers import Controller from ...response import Response diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py index 3a75182b..1c686cbb 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py @@ -37,7 +37,9 @@ class DumpExceptionHandler: def __init__(self, application): self.application = application - self.assets_path = os.path.join(get_module_dir(__file__), "../../templates/assets") + self.assets_path = os.path.join( + get_module_dir(__file__), "../../templates/assets" + ) self.styles = [] self.scripts = [] diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py index a6f57385..e88bd22c 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py @@ -18,7 +18,9 @@ def handle(self, exception): # Renders HTTP exception as HTML with predefined error page if exists if self.application.make("view").exists(view_name): return response.view( - self.application.make("view").render(f"errors/{status_code}", {"message": exception.get_response()}), + self.application.make("view").render( + f"errors/{status_code}", {"message": exception.get_response()} + ), status_code, ) else: diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py index 68d53106..7d6880eb 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py @@ -6,6 +6,8 @@ def __init__(self, application): self.application = application def handle(self, exception): - masonite_exception = ModelNotFoundException("No record found with the given primary key") + masonite_exception = ModelNotFoundException( + "No record found with the given primary key" + ) self.application.make("response").status(404) self.application.make("exception_handler").handle(masonite_exception) diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions/__init__.py b/fastapi_startkit/src/fastapi_startkit/exceptions/__init__.py index 5fd0447a..b39dec8a 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions/__init__.py @@ -1,34 +1,34 @@ +from .handler import ExceptionHandler from .exceptions import ( - AmbiguousError, AuthorizationException, + InvalidRouteCompileException, + RouteMiddlewareNotFound, ContainerError, - DumpException, - InvalidConfigurationLocation, - InvalidConfigurationSetup, - InvalidCSRFToken, + MissingContainerBindingNotFound, + StrictContainerException, + ResponseError, InvalidHTTPStatusCode, - InvalidPackageName, - InvalidRouteCompileException, + RequiredContainerBindingNotFound, + ViewException, + RouteNotFoundException, + DumpException, InvalidSecretKey, - InvalidToken, - LoaderNotFound, - MethodNotAllowedException, - MissingContainerBindingNotFound, - MixFileNotFound, - MixManifestNotFound, - ModelNotFoundException, + InvalidCSRFToken, NotificationException, + InvalidToken, ProjectLimitReached, - ProjectProviderHttpError, ProjectProviderTimeout, + ProjectProviderHttpError, ProjectTargetNotEmpty, + MixFileNotFound, + MixManifestNotFound, + InvalidConfigurationLocation, + InvalidConfigurationSetup, + InvalidPackageName, + LoaderNotFound, QueueException, - RequiredContainerBindingNotFound, - ResponseError, - RouteMiddlewareNotFound, - RouteNotFoundException, - StrictContainerException, + AmbiguousError, + MethodNotAllowedException, + ModelNotFoundException, ThrottleRequestsException, - ViewException, ) -from .handler import ExceptionHandler diff --git a/fastapi_startkit/src/fastapi_startkit/exceptions/handler.py b/fastapi_startkit/src/fastapi_startkit/exceptions/handler.py index 8b0d89c7..f61996f1 100644 --- a/fastapi_startkit/src/fastapi_startkit/exceptions/handler.py +++ b/fastapi_startkit/src/fastapi_startkit/exceptions/handler.py @@ -1,7 +1,9 @@ -import atexit import sys +import atexit from typing import Any, Callable, Dict, List, Optional, Type +from dumpdie import dd + class ExceptionHandler: def __init__(self, application=None): @@ -60,14 +62,12 @@ def report(self, exception: Exception): self.report_exception(exception) def report_exception(self, exception: Exception): - if self.app and self.app.has("logger"): + if self.app and self.app.has('logger'): from fastapi_startkit.logging.logger import Logger - Logger.error(self._build_context(exception)) def _build_context(self, exception: Exception) -> str: import traceback - context = f"{type(exception).__name__}: {exception}" if self.app and self.app.is_debug(): context += "\n" + "".join(traceback.format_exception(type(exception), exception, exception.__traceback__)) diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Auth.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Auth.pyi index fc2e1484..514777ed 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Auth.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Auth.pyi @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, List, Tuple +from typing import TYPE_CHECKING, Any, Tuple, List if TYPE_CHECKING: from ..routes import Route diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Config.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Config.pyi index 44853b0d..724fed31 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Config.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Config.pyi @@ -1,5 +1,6 @@ from typing import Any + class Config: """Configuration facades to manage Masonite config files.""" @staticmethod diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Dump.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Dump.pyi index c011289f..15776405 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Dump.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Dump.pyi @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, List +from typing import Any, List, TYPE_CHECKING if TYPE_CHECKING: from ..dumps import Dump as DumpObject diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Facade.py b/fastapi_startkit/src/fastapi_startkit/facades/Facade.py index 9c26a29b..ce34440a 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Facade.py +++ b/fastapi_startkit/src/fastapi_startkit/facades/Facade.py @@ -1,5 +1,4 @@ class Facade(type): def __getattr__(self, attribute, *args, **kwargs): from ..application import app - return getattr(app().make(self.key), attribute) diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Gate.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Gate.pyi index fc6437bf..af9edf96 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Gate.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Gate.pyi @@ -1,8 +1,7 @@ -from typing import TYPE_CHECKING, Any, Callable, List, Tuple +from typing import TYPE_CHECKING, Callable, List, Tuple, Any if TYPE_CHECKING: - from ..authorization import AuthorizationResponse, Policy - from ..authorization import Gate as GateObject + from ..authorization import AuthorizationResponse, Policy, Gate as GateObject class Gate: """Gate facade.""" diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Hash.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Hash.pyi index fca84bab..55d74729 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Hash.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Hash.pyi @@ -20,7 +20,9 @@ class Hash: ) -> bool: """Verify that a given string matches its hashed version (based on configured hashing protocol).""" ... - def needs_rehash(hashed_string: str, options: dict = {}, driver: str = None) -> bool: + def needs_rehash( + hashed_string: str, options: dict = {}, driver: str = None + ) -> bool: """Verify that a given hash needs to be hashed again because parameters for generating the hash have changed.""" ... diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Loader.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Loader.pyi index 7ce200ed..04aa5661 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Loader.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Loader.pyi @@ -10,8 +10,12 @@ class Loader: class_name: str, raise_exception: bool = False, ) -> "None|Any": ... - def find_all(class_instance: Any, paths: list, raise_exception: bool = False) -> dict: ... - def get_object(path_or_module: "str|Any", object_name: str, raise_exception: bool = False) -> Any: + def find_all( + class_instance: Any, paths: list, raise_exception: bool = False + ) -> dict: ... + def get_object( + path_or_module: "str|Any", object_name: str, raise_exception: bool = False + ) -> Any: """Load the given object from a Python module located at path and returns a default value if not found. If no object name is provided, returns the loaded module.""" ... diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Mail.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Mail.pyi index 039faaf6..81fc22fa 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Mail.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Mail.pyi @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any +from typing import Any, TYPE_CHECKING if TYPE_CHECKING: from ..mail import Mailable diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Notification.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Notification.pyi index 6add0eb7..6066ffdf 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Notification.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Notification.pyi @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any +from typing import Any, TYPE_CHECKING if TYPE_CHECKING: from ..notification import Notification as NotificationObject diff --git a/fastapi_startkit/src/fastapi_startkit/facades/RateLimiter.pyi b/fastapi_startkit/src/fastapi_startkit/facades/RateLimiter.pyi index 168a58a4..9b9609ce 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/RateLimiter.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/RateLimiter.pyi @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, Callable +from typing import Any, Callable, TYPE_CHECKING if TYPE_CHECKING: from ..rates.limiters import Limiter @@ -15,7 +15,9 @@ class RateLimiter: def get_limiter(self, name: str) -> "Limiter": """Get rate limiter registered with the given name.""" ... - def attempt(key: str, callback: Callable, max_attempts: int, delay: int = 60) -> Any: + def attempt( + key: str, callback: Callable, max_attempts: int, delay: int = 60 + ) -> Any: """Try to execute the given callback if not limited by the 'key' rate limiter.""" ... def too_many_attempts(self, key: str, max_attempts: int) -> bool: diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Request.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Request.pyi index f431cc26..284b9cf4 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Request.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Request.pyi @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, List +from typing import TYPE_CHECKING, List, Any if TYPE_CHECKING: from ..routes import Route diff --git a/fastapi_startkit/src/fastapi_startkit/facades/View.pyi b/fastapi_startkit/src/fastapi_startkit/facades/View.pyi index 5be7e42d..0f7e6640 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/View.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/View.pyi @@ -1,6 +1,5 @@ -from typing import Any, Callable - -from jinja2 import BaseLoader, PackageLoader +from typing import Callable, Any +from jinja2 import PackageLoader, BaseLoader class View: """View facade.""" diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Vite.py b/fastapi_startkit/src/fastapi_startkit/facades/Vite.py index 415318f0..7735c9a6 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Vite.py +++ b/fastapi_startkit/src/fastapi_startkit/facades/Vite.py @@ -2,4 +2,4 @@ class Vite(metaclass=Facade): - key = "vite" + key = "vite" \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/facades/Vite.pyi b/fastapi_startkit/src/fastapi_startkit/facades/Vite.pyi index 1e8380e6..d7313e7c 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/Vite.pyi +++ b/fastapi_startkit/src/fastapi_startkit/facades/Vite.pyi @@ -1,5 +1,6 @@ from typing import Callable, Optional + class Vite: """Facade for the Vite asset helper. @@ -88,4 +89,4 @@ class Vite: @staticmethod def to_html() -> str: """Render pre-configured entry points as an HTML string.""" - ... + ... \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/facades/__init__.py b/fastapi_startkit/src/fastapi_startkit/facades/__init__.py index 73693277..de7ed3a8 100644 --- a/fastapi_startkit/src/fastapi_startkit/facades/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/facades/__init__.py @@ -1,20 +1,20 @@ -from .Auth import Auth -from .Broadcast import Broadcast -from .Cache import Cache -from .Config import Config -from .Dump import Dump from .Facade import Facade -from .Gate import Gate +from .Request import Request +from .Response import Response +from .Mail import Mail from .Hash import Hash -from .Inertia import Inertia +from .Url import Url +from .Session import Session +from .View import View +from .Gate import Gate +from .Auth import Auth +from .Config import Config from .Loader import Loader -from .Mail import Mail from .Notification import Notification +from .Storage import Storage +from .Dump import Dump from .Queue import Queue +from .Cache import Cache from .RateLimiter import RateLimiter -from .Request import Request -from .Response import Response -from .Session import Session -from .Storage import Storage -from .Url import Url -from .View import View +from .Broadcast import Broadcast +from .Inertia import Inertia diff --git a/fastapi_startkit/src/fastapi_startkit/fastapi/__init__.py b/fastapi_startkit/src/fastapi_startkit/fastapi/__init__.py index c6d8ccc7..4cde3cfb 100644 --- a/fastapi_startkit/src/fastapi_startkit/fastapi/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/fastapi/__init__.py @@ -1,7 +1,5 @@ from .providers.fastapi_provider import FastAPIProvider -from .routers.router import Router __all__ = [ - "FastAPIProvider", - "Router" + 'FastAPIProvider', ] diff --git a/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py b/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py index 1ee16846..f81dd703 100644 --- a/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py +++ b/fastapi_startkit/src/fastapi_startkit/fastapi/commands/serve_command.py @@ -15,7 +15,6 @@ class ServeCommand(Command): def handle(self): import uvicorn - from fastapi_startkit.container import Container port = int(self.option("port")) @@ -33,29 +32,30 @@ def handle(self): } if exist: - kwargs.update( - { - "app": app, - "reload": reload, - "factory": True, - "reload_excludes": ["*.log", "tests/*"], - } - ) + kwargs.update({ + 'app': app, + 'reload': reload, + "factory": True, + "reload_excludes": ["*.log", "tests/*"], + }) self.line(f"Starting Uvicorn server on {host}:{port} [{app}]...") + else: self.line(f"Starting Uvicorn server on {host}:{port}...") - kwargs.update({"app": Container.instance().fastapi, "reload": False}) + kwargs.update({ + "app": Container.instance().fastapi, + "reload": False + }) try: uvicorn.run(**kwargs) except KeyboardInterrupt: self.line("Server stopped manually.") - def is_app_exist(self) -> "bool": + def is_app_exist(self) -> 'bool': import importlib.util - app = self.option("app") module_name = app.split(":")[0] @@ -66,6 +66,6 @@ def is_app_exist(self) -> "bool": except (ImportError, ValueError): pass - self.line("Unable to detect the application, run the command with --app={app}") + self.line('Unable to detect the application, run the command with --app={app}') return False diff --git a/fastapi_startkit/src/fastapi_startkit/fastapi/providers/fastapi_provider.py b/fastapi_startkit/src/fastapi_startkit/fastapi/providers/fastapi_provider.py index 35eadb88..e4697f1e 100644 --- a/fastapi_startkit/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +++ b/fastapi_startkit/src/fastapi_startkit/fastapi/providers/fastapi_provider.py @@ -1,7 +1,6 @@ from fastapi import FastAPI - -from fastapi_startkit.fastapi.commands import ServeCommand from fastapi_startkit.providers import Provider +from fastapi_startkit.fastapi.commands import ServeCommand class FastAPIProvider(Provider): @@ -15,19 +14,25 @@ def register(self) -> None: self.app.use_fastapi(fastapi) def boot(self): - self.commands([ServeCommand]) - self._register_exception_handlers() - - def _register_exception_handlers(self): - """Wire exception_manager as a catch-all handler for all exceptions.""" - if not self.app.exception_manager: - return - - exception_manager = self.app.exception_manager - - async def handler(request, exc): - return await exception_manager.handle(exc, {"request": request}) - - self.app.fastapi.add_exception_handler(Exception, handler) - - + self.commands([ + ServeCommand + ]) + + """ + Register routes + + ```python routes/api.py + from fastapi import APIRouter + + public = APIRouter() + ``` + + ```python providers/fastapi_provider.py + + class FastAPIServiceProvider(BaseServiceProvider): + def boot(self): + from routes.api import public + + self.app.use_router(public) + ``` + """ diff --git a/fastapi_startkit/src/fastapi_startkit/helpers/dataclass.py b/fastapi_startkit/src/fastapi_startkit/helpers/dataclass.py index 48714172..742b7965 100644 --- a/fastapi_startkit/src/fastapi_startkit/helpers/dataclass.py +++ b/fastapi_startkit/src/fastapi_startkit/helpers/dataclass.py @@ -1,6 +1,7 @@ -import dataclasses from typing import Any +import dataclasses + class Dataclass: @staticmethod diff --git a/fastapi_startkit/src/fastapi_startkit/helpers/string.py b/fastapi_startkit/src/fastapi_startkit/helpers/string.py index b27e1f35..4ca816ef 100644 --- a/fastapi_startkit/src/fastapi_startkit/helpers/string.py +++ b/fastapi_startkit/src/fastapi_startkit/helpers/string.py @@ -8,24 +8,24 @@ def __init__(self, text: str): def __str__(self) -> str: return self.text - def trim(self, suffix: str) -> "Stringable": + def trim(self, suffix: str) -> 'Stringable': return Stringable(Str.trim(self.text, suffix)) - def slugify(self) -> "Stringable": + def slugify(self) -> 'Stringable': return Stringable(Str.slugify(self.text)) class Str: @classmethod - def of(cls, text: str) -> "Stringable": + def of(cls, text: str) -> 'Stringable': return Stringable(text) @classmethod def slugify(cls, text: str) -> str: """Strip all non-alphanumeric characters and lowercase.""" - return re.sub(r"[^a-z0-9]", "", text.lower()) + return re.sub(r'[^a-z0-9]', '', text.lower()) @classmethod def trim(cls, text: str, word: str) -> str: """Remove all occurrences of a word from the string (case-insensitive).""" - return re.sub(re.escape(word), "", text, flags=re.IGNORECASE).strip("_").strip() + return re.sub(re.escape(word), '', text, flags=re.IGNORECASE).strip('_').strip() diff --git a/fastapi_startkit/src/fastapi_startkit/inertia/__init__.py b/fastapi_startkit/src/fastapi_startkit/inertia/__init__.py index 3cb04828..84ce5dfd 100644 --- a/fastapi_startkit/src/fastapi_startkit/inertia/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/inertia/__init__.py @@ -1,9 +1,5 @@ -from .inertia import Inertia, InertiaResponse +from .inertia import Inertia from .middleware import InertiaMiddleware from .provider import InertiaProvider -__all__ = [ - "Inertia", - "InertiaMiddleware", - "InertiaProvider" -] +__all__ = ["Inertia", "InertiaMiddleware", "InertiaProvider"] diff --git a/fastapi_startkit/src/fastapi_startkit/inertia/inertia.py b/fastapi_startkit/src/fastapi_startkit/inertia/inertia.py index dd7e149f..c88717f2 100644 --- a/fastapi_startkit/src/fastapi_startkit/inertia/inertia.py +++ b/fastapi_startkit/src/fastapi_startkit/inertia/inertia.py @@ -1,183 +1,74 @@ -import inspect +import json from typing import Any, Dict, Optional, Union -from urllib.parse import urlparse +from fastapi import Request, Response +from fastapi.responses import JSONResponse, HTMLResponse +from starlette.templating import Jinja2Templates -from fastapi import Request -from fastapi.responses import JSONResponse -from starlette.responses import Response - -from fastapi_startkit.inertia.props.props import OptionalProp -from fastapi_startkit.inertia.constant import Header -from fastapi_startkit.inertia.context import current_request - - -class ResponseFactory: - """Holds all Inertia state: app container, root view, shared props, version.""" - - def __init__(self): - self.root_view: str = "index.html" - self.shared_props: dict = {} - self.version = None - - def set_root_view(self, view: str): - self.root_view = view +class Inertia: + def __init__(self, application): + self.app = application + self._shared_data: Dict[str, Any] = {} + self._version: Optional[str] = None + self._root_view: str = "index.html" def share(self, key: Union[str, Dict[str, Any]], value: Any = None): + """Share data globally across all components.""" if isinstance(key, dict): - self.shared_props = {**self.shared_props, **key} + self._shared_data.update(key) else: - self.shared_props[key] = value + self._shared_data[key] = value - def set_version(self, version): - self.version = version + def version(self, version: str): + """Set the current asset version.""" + self._version = version def get_version(self) -> Optional[str]: - v = self.version() if callable(self.version) else self.version - return str(v) if v is not None else None - - def render(self, component: str, props: dict) -> 'InertiaResponse': - return InertiaResponse( - component=component, - shared_props=self.shared_props, - props=props, - root_view=self.root_view, - version=self.get_version() or '', - ) - - -class InertiaResponse(Response): - def __init__( - self, - component: str, - shared_props: dict, - props: dict, - root_view: str = 'index.html', - version: str = '', - ): - # Do not call supper().__init__() — body is built lazily in __call__ - self.background = None # required by FastAPI's response handling - self.component = component - self.shared_props = shared_props - self.props = props - self.root_view = root_view - self.version = version - - def with_(self, key: Union[str, Dict[str, Any]], value: Any = None) -> 'InertiaResponse': - if isinstance(key, dict): - self.props = {**self.props, **key} - else: - self.props[key] = value - return self - - def with_root_view(self, root_view: str) -> 'InertiaResponse': - self.root_view = root_view - return self - - async def to_response(self, request: Request): - # Determine partial reload scope - partial_component = request.headers.get(Header.INERTIA_PARTIAL_COMPONENT) - is_partial = partial_component == self.component - partial_keys: set = set() - if is_partial: - raw = request.headers.get("X-Inertia-Partial-Data", "") - partial_keys = set(filter(None, raw.split(","))) - - all_props = {**self.shared_props, **self.props} - - resolved: dict = {} - for k, v in all_props.items(): - # OptionalProp: only include when explicitly requested in a partial reload - if isinstance(v, OptionalProp): - if not is_partial or k not in partial_keys: - continue - v = v.callback - - # Skip keys aren't requested in partial reload - if is_partial and partial_keys and k not in partial_keys: - continue - - # Resolve callables — support both sync and async - if callable(v): - sig = inspect.signature(v) - result = v(request) if len(sig.parameters) > 0 else v() - if inspect.isawaitable(result): - result = await result - resolved[k] = result - else: - resolved[k] = v + """Get the current asset version.""" + return self._version + + def set_root_view(self, root_view: str): + """Set the root view template name.""" + self._root_view = root_view + + def render(self, request: Request, component: str, props: Optional[Dict[str, Any]] = None) -> Response: + """Render an Inertia response.""" + props = props or {} + + # Merge shared data + # Note: In a real implementation, we might want to resolve callables here + all_props = {**self._shared_data, **props} + + # Handle Partial Reloads + partial_component = request.headers.get("X-Inertia-Partial-Component") + if partial_component == component: + partial_data = request.headers.get("X-Inertia-Partial-Data") + if partial_data: + keys = partial_data.split(",") + all_props = {k: v for k, v in all_props.items() if k in keys} page = { - "component": self.component, - "props": resolved, - "url": self._get_url(request), - "version": self.version, + "component": component, + "props": all_props, + "url": str(request.url.path), + "version": self._version, } - if request.headers.get(Header.INERTIA): + if request.headers.get("X-Inertia"): return JSONResponse( content=page, - headers={Header.INERTIA: "true"}, + headers={ + "X-Inertia": "true", + "Vary": "Accept", + } ) - from fastapi_startkit.application import app as container - if not container().has("templates"): - raise RuntimeError( - "Inertia requires 'templates' to be bound in the container for initial rendering." - ) - - return container().make("templates").TemplateResponse( + # Initial render: return HTML root view + if not self.app.has("templates"): + raise RuntimeError("Inertia requires 'templates' to be bound in the container for initial rendering.") + + templates = self.app.make("templates") + return templates.TemplateResponse( request, - self.root_view, - {"page": page}, + self._root_view, + {"page": page} ) - - def _get_url(self, request: Request) -> str: - parsed = urlparse(str(request.url)) - url = parsed.path - if parsed.query: - url = f"{url}?{parsed.query}" - return url or "/" - - async def __call__(self, scope, receive, send): - request = current_request.get() - if request is None: - raise RuntimeError( - "InertiaResponse requires InertiaMiddleware to be registered. " - "Add app.add_middleware(InertiaMiddleware) to your bootstrap." - ) - actual_response = await self.to_response(request) - await actual_response(scope, receive, send) - - -class Inertia: - _instance: Optional[ResponseFactory] = None - - @classmethod - def instance(cls): - if cls._instance is None: - cls._instance = ResponseFactory() - return cls._instance - - @staticmethod - def set_root_view(root_view: str): - Inertia.instance().set_root_view(root_view) - - @staticmethod - def share(key: Union[str, Dict[str, Any]], value: Any = None): - Inertia.instance().share(key, value) - - @staticmethod - def version(version): - Inertia.instance().set_version(version) - - @staticmethod - def get_version() -> Optional[str]: - return Inertia.instance().get_version() - - @staticmethod - def optional(callback) -> OptionalProp: - return OptionalProp(callback) - - @staticmethod - def render(component: str, props: Optional[Dict[str, Any]] = None) -> InertiaResponse: - return Inertia.instance().render(component, props or {}) diff --git a/fastapi_startkit/src/fastapi_startkit/inertia/middleware.py b/fastapi_startkit/src/fastapi_startkit/inertia/middleware.py index bc6e17b8..2c473963 100644 --- a/fastapi_startkit/src/fastapi_startkit/inertia/middleware.py +++ b/fastapi_startkit/src/fastapi_startkit/inertia/middleware.py @@ -1,105 +1,45 @@ -from typing import Optional - -from fastapi import status -from fastapi_startkit.inertia.constant import Header -from fastapi_startkit.inertia.inertia import Inertia -from fastapi_startkit.inertia.context import current_request from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint from starlette.requests import Request -from starlette.responses import RedirectResponse, Response - +from starlette.responses import Response +from fastapi import status class InertiaMiddleware(BaseHTTPMiddleware): - _root_view: str = 'index.html' - - @staticmethod - def version(request: Request) -> Optional[str]: - """Determine the current asset version from the Vite manifest hash.""" - from fastapi_startkit.application import app as container - if container().has("vite"): - return container().make("vite").manifest_hash() - return None - - @staticmethod - def share(request: Request) -> dict: - """Define props that are shared on every response.""" - return { - 'errors': InertiaMiddleware.resolve_validation_errors(request), - } - - @classmethod - def root_view(cls, request: Request) -> str: - """Return the root template name for the first page visit.""" - return cls._root_view - async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: - Inertia.version(lambda: self.version(request)) - Inertia.share(self.share(request)) - Inertia.set_root_view(self.root_view(request)) - - token = current_request.set(request) - try: - response = await call_next(request) - finally: - current_request.reset(token) - - response.headers['Vary'] = Header.INERTIA - - is_redirect = response.status_code in (301, 302, 303, 307, 308) - if is_redirect: - self.reflash(request) - - if not request.headers.get(Header.INERTIA): - return response - - # Version conflict — ask client to do a full page reload + # Access the application container + # The application instance is typically available on the request.app if set, + # but in this framework it might be better to use the singleton or a property. + from fastapi_startkit.application import app + container = app() + + if not container.has("inertia"): + return await call_next(request) + + inertia = container.make("inertia") + + # 1. Version Check + if request.headers.get("X-Inertia"): + client_version = request.headers.get("X-Inertia-Version") + server_version = inertia.get_version() + + # If versions mismatch, return 409 Conflict + if client_version and server_version and client_version != server_version: + return Response( + status_code=status.HTTP_409_CONFLICT, + headers={"X-Inertia-Location": str(request.url)} + ) + + response = await call_next(request) + + # 2. Redirect Handling (302 -> 303 for non-GET Inertia requests) + # This ensures the browser performs a GET on the new URL. if ( - request.method == "GET" - and request.headers.get(Header.INERTIA_VERSION, '') != (Inertia.get_version() or '') + request.headers.get("X-Inertia") + and response.status_code == 302 + and request.method in ["PUT", "PATCH", "DELETE"] ): - return self.on_version_change(request, response) - - # 302 → 303 for PUT/PATCH/DELETE so browser issues a GET - if response.status_code == 302 and request.method in ["PUT", "PATCH", "DELETE"]: response.status_code = status.HTTP_303_SEE_OTHER - # Redirect with fragment → 409 so Inertia handles fragment preservation - location = response.headers.get("location", "") - if is_redirect and "#" in location: - return self.on_redirect_with_fragment(request, response) - + # 3. Add Vary header + response.headers["Vary"] = "X-Inertia" + return response - - @staticmethod - def on_version_change(request: Request, response: Response) -> Response: - return Response( - status_code=status.HTTP_409_CONFLICT, - headers={Header.INERTIA_LOCATION: str(request.url)}, - ) - - @staticmethod - def on_empty_response(request: Request, response: Response) -> Response: - referer = request.headers.get("referer", "/") - return RedirectResponse(url=referer, status_code=302) - - @staticmethod - def on_redirect_with_fragment(request: Request, response: Response) -> Response: - return Response( - status_code=status.HTTP_409_CONFLICT, - headers={Header.INERTIA_REDIRECT: response.headers.get("location", "/")}, - ) - - @staticmethod - def resolve_validation_errors(request: Request) -> dict: - if "session" not in request.scope: - return {} - return request.session.get("errors", {}) - - @staticmethod - def reflash(request: Request) -> None: - """Re-flash session data so it survives the redirect.""" - if "session" not in request.scope: - return - flash = request.session.get("_flash", {}) - if flash: - request.session["_flash"] = flash diff --git a/fastapi_startkit/src/fastapi_startkit/inertia/provider.py b/fastapi_startkit/src/fastapi_startkit/inertia/provider.py index cff6f871..2df256f8 100644 --- a/fastapi_startkit/src/fastapi_startkit/inertia/provider.py +++ b/fastapi_startkit/src/fastapi_startkit/inertia/provider.py @@ -1,17 +1,14 @@ import json - from fastapi_startkit.providers import Provider - from .inertia import Inertia from .middleware import InertiaMiddleware - class InertiaProvider(Provider): provider_key = "inertia" def register(self) -> None: """Bind the Inertia class to the container.""" - self.app.bind("inertia", Inertia()) + self.app.bind("inertia", Inertia(self.app)) def boot(self) -> None: """Configure template globals and middleware.""" @@ -32,9 +29,7 @@ def inertia_helper(page): """Jinja2 helper to render the root div for Inertia.""" encoded_page = json.dumps(page) # Ensure single quotes are used for the attribute to avoid conflict with JSON double quotes - return Markup( - f'
' - ) + return Markup(f'
') templates.env.globals["inertia"] = inertia_helper diff --git a/fastapi_startkit/src/fastapi_startkit/loader/Loader.py b/fastapi_startkit/src/fastapi_startkit/loader/Loader.py index c243b3cd..0936d79d 100644 --- a/fastapi_startkit/src/fastapi_startkit/loader/Loader.py +++ b/fastapi_startkit/src/fastapi_startkit/loader/Loader.py @@ -1,7 +1,7 @@ """Loader class to easily list, find or load any object in a given module, or folder.""" - import inspect import pkgutil +import os from ..exceptions import LoaderNotFound from ..utils.str import as_filepath @@ -9,7 +9,10 @@ def parameters_filter(obj_name, obj): - return not obj_name.startswith("__") and not obj_name.endswith("__") + return ( + not obj_name.startswith("__") + and not obj_name.endswith("__") + ) class Loader: @@ -33,7 +36,9 @@ def find(self, class_instance, paths, class_name, raise_exception=False): if name == class_name: return obj if raise_exception: - raise LoaderNotFound(f"No {class_instance} named {class_name} has been found in {paths}") + raise LoaderNotFound( + f"No {class_instance} named {class_name} has been found in {paths}" + ) return None def find_all(self, class_instance, paths, raise_exception=False): diff --git a/fastapi_startkit/src/fastapi_startkit/logging/ChannelFactory.py b/fastapi_startkit/src/fastapi_startkit/logging/ChannelFactory.py index 931b4149..d6587c5a 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/ChannelFactory.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/ChannelFactory.py @@ -1,14 +1,14 @@ -from .channels import DailyChannel, SingleChannel, SlackChannel, StackChannel, SyslogChannel, TerminalChannel - +from .channels import SingleChannel, DailyChannel, SlackChannel, StackChannel, SyslogChannel, TerminalChannel class ChannelFactory: + channels = { - "single": SingleChannel, - "daily": DailyChannel, - "slack": SlackChannel, - "stack": StackChannel, - "syslog": SyslogChannel, - "terminal": TerminalChannel, + 'single': SingleChannel, + 'daily': DailyChannel, + 'slack': SlackChannel, + 'stack': StackChannel, + 'syslog': SyslogChannel, + 'terminal': TerminalChannel } @classmethod diff --git a/fastapi_startkit/src/fastapi_startkit/logging/__init__.py b/fastapi_startkit/src/fastapi_startkit/logging/__init__.py index 60702734..12a4a585 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/__init__.py @@ -1,4 +1,7 @@ from .logger import Logger from .providers import LogProvider -__all__ = ["Logger", "LogProvider"] +__all__ = [ + 'Logger', + 'LogProvider' +] diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/BaseChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/BaseChannel.py index 741c76d0..866d17ab 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/BaseChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/BaseChannel.py @@ -1,64 +1,61 @@ import pendulum - from fastapi_startkit.facades import Config - class BaseChannel: def get_time(self): - return pendulum.now().in_tz(Config.get("logging.channels.timezone", "UTC")) + return pendulum.now().in_tz(Config.get('logging.channels.timezone', 'UTC')) def log(self, level, message, *args, **kwargs): return self.driver.should_run(level, self.max_level) def emergency(self, message, *args, **kwargs): - if not self.driver.should_run("emergency", self.max_level): + if not self.driver.should_run('emergency', self.max_level): return return self.driver.emergency(message, *args, **kwargs) def alert(self, message, *args, **kwargs): - if not self.driver.should_run("alert", self.max_level): + if not self.driver.should_run('alert', self.max_level): return return self.driver.alert(message, *args, **kwargs) def critical(self, message, *args, **kwargs): - if not self.driver.should_run("critical", self.max_level): + if not self.driver.should_run('critical', self.max_level): return return self.driver.critical(message, *args, **kwargs) def error(self, message, *args, **kwargs): - if not self.driver.should_run("error", self.max_level): + if not self.driver.should_run('error', self.max_level): return return self.driver.error(message, *args, **kwargs) def warning(self, message, *args, **kwargs): - if not self.driver.should_run("warning", self.max_level): + if not self.driver.should_run('warning', self.max_level): return return self.driver.warning(message, *args, **kwargs) def notice(self, message, *args, **kwargs): - if not self.driver.should_run("notice", self.max_level): + if not self.driver.should_run('notice', self.max_level): return return self.driver.notice(message, *args, **kwargs) def info(self, message, *args, **kwargs): - if not self.driver.should_run("info", self.max_level): + if not self.driver.should_run('info', self.max_level): return return self.driver.info(message, *args, **kwargs) def debug(self, message, *args, **kwargs): - if not self.driver.should_run("debug", self.max_level): + if not self.driver.should_run('debug', self.max_level): return return self.driver.debug(message, *args, **kwargs) def channel(self, channel): from ..ChannelFactory import ChannelFactory - return ChannelFactory().make(channel)() diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/DailyChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/DailyChannel.py index 014e67d0..ea5b30ee 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/DailyChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/DailyChannel.py @@ -1,21 +1,16 @@ -import os - +from ..factory import DriverFactory from fastapi_startkit.facades import Config from fastapi_startkit.utils.filesystem import make_directory - -from ..factory import DriverFactory +import os from .BaseChannel import BaseChannel - class DailyChannel(BaseChannel): def __init__(self, driver=None, path=None): - path = path or Config.get("logging.channels.daily.path", "") - path = os.path.join(path, self.get_time().to_date_string() + ".log") - self.max_level = Config.get("logging.channels.daily.level") + path = path or Config.get('logging.channels.daily.path','') + path = os.path.join(path, self.get_time().to_date_string() + '.log') + self.max_level = Config.get('logging.channels.daily.level') make_directory(path) - self.driver = DriverFactory.make(driver or Config.get("logging.channels.daily.driver"))( - path=path, max_level=self.max_level - ) + self.driver = DriverFactory.make(driver or Config.get('logging.channels.daily.driver'))(path=path, max_level=self.max_level) def debug(self, message, *args, **kwargs): return self.driver.debug(message, *args, **kwargs) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/MultiBaseChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/MultiBaseChannel.py index 485d1417..7f470373 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/MultiBaseChannel.py @@ -1,64 +1,64 @@ import pendulum - from fastapi_startkit.facades import Config - class MultiBaseChannel: + def get_time(self): - return pendulum.now().in_tz(Config.get("logging.channels.timezone", "UTC")) + return pendulum.now().in_tz(Config.get('logging.channels.timezone', 'UTC')) def emergency(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("emergency", channel.max_level): + if not channel.driver.should_run('emergency', channel.max_level): continue channel.driver.emergency(message, *args, **kwargs) def alert(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("alert", channel.max_level): + if not channel.driver.should_run('alert', channel.max_level): continue channel.driver.alert(message, *args, **kwargs) def critical(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("critical", channel.max_level): + if not channel.driver.should_run('critical', channel.max_level): continue channel.driver.critical(message, *args, **kwargs) def error(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("error", channel.max_level): + if not channel.driver.should_run('error', channel.max_level): continue channel.driver.error(message, *args, **kwargs) def warning(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("warning", channel.max_level): + if not channel.driver.should_run('warning', channel.max_level): continue channel.driver.warning(message, *args, **kwargs) def notice(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("notice", channel.max_level): + if not channel.driver.should_run('notice', channel.max_level): continue channel.driver.notice(message, *args, **kwargs) def info(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("info", channel.max_level): + if not channel.driver.should_run('info', channel.max_level): continue channel.driver.info(message, *args, **kwargs) def debug(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("debug", channel.max_level): + if not channel.driver.should_run('debug', channel.max_level): continue channel.driver.debug(message, *args, **kwargs) + diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/SingleChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/SingleChannel.py index d1d3785c..dab30dfe 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/SingleChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/SingleChannel.py @@ -1,15 +1,14 @@ +from ..factory import DriverFactory from fastapi_startkit.facades import Config from fastapi_startkit.utils.filesystem import make_directory - -from ..factory import DriverFactory +import os +import pendulum from .BaseChannel import BaseChannel class SingleChannel(BaseChannel): def __init__(self, driver=None, path=None): - path = path or Config.get("logging.channels.single.path") + path = path or Config.get('logging.channels.single.path') make_directory(path) - self.max_level = Config.get("logging.channels.single.level") - self.driver = DriverFactory.make(driver or Config.get("logging.channels.single.driver"))( - path=path, max_level=self.max_level - ) + self.max_level = Config.get('logging.channels.single.level') + self.driver = DriverFactory.make(driver or Config.get('logging.channels.single.driver'))(path=path, max_level=self.max_level) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/SlackChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/SlackChannel.py index af49453d..5ece2141 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/SlackChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/SlackChannel.py @@ -1,19 +1,19 @@ -from fastapi_startkit.facades import Config from ..factory import DriverFactory +from fastapi_startkit.facades import Config +import os +import pendulum from .BaseChannel import BaseChannel - class SlackChannel(BaseChannel): + def __init__(self, driver=None, path=None): - token = Config.get("logging.channels.slack.token") - channel = Config.get("logging.channels.slack.channel") - emoji = Config.get("logging.channels.slack.emoji") - username = Config.get("logging.channels.slack.username") - self.max_level = Config.get("logging.channels.slack.level") - self.driver = DriverFactory.make(driver or Config.get("logging.channels.slack.driver"))( - emoji=emoji, username=username, token=token, channel=channel - ) + token = Config.get('logging.channels.slack.token') + channel = Config.get('logging.channels.slack.channel') + emoji = Config.get('logging.channels.slack.emoji') + username = Config.get('logging.channels.slack.username') + self.max_level = Config.get('logging.channels.slack.level') + self.driver = DriverFactory.make(driver or Config.get('logging.channels.slack.driver'))(emoji=emoji, username=username, token=token, channel=channel) def debug(self, message, *args, **kwargs): return self.driver.debug(message, *args, **kwargs) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/StackChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/StackChannel.py index a109bdfb..625e84ac 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/StackChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/StackChannel.py @@ -1,13 +1,10 @@ from .MultiBaseChannel import MultiBaseChannel - class StackChannel(MultiBaseChannel): def __init__(self, channels=None): from fastapi_startkit.facades import Config - - channels = channels or Config.get("logging.channels.stack.channels", []) + channels = channels or Config.get('logging.channels.stack.channels', []) from ..ChannelFactory import ChannelFactory - self.channels = [] for channel in channels: channel_class = ChannelFactory.make(channel) @@ -16,14 +13,15 @@ def __init__(self, channels=None): def debug(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("debug", channel.max_level): + if not channel.driver.should_run('debug', channel.max_level): continue channel.driver.debug(message, *args, **kwargs) def notice(self, message, *args, **kwargs): for channel in self.channels: - if not channel.driver.should_run("notice", channel.max_level): + if not channel.driver.should_run('notice', channel.max_level): continue channel.driver.notice(message, *args, **kwargs) + diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/SyslogChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/SyslogChannel.py index a70a8844..e0d9faea 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/SyslogChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/SyslogChannel.py @@ -1,15 +1,14 @@ +from ..factory import DriverFactory from fastapi_startkit.facades import Config from fastapi_startkit.utils.filesystem import make_directory - -from ..factory import DriverFactory +import os +import pendulum from .BaseChannel import BaseChannel - class SyslogChannel(BaseChannel): + def __init__(self, driver=None, path=None): - path = path or Config.get("logging.channels.syslog.path") + path = path or Config.get('logging.channels.syslog.path') make_directory(path) - self.max_level = Config.get("logging.channels.syslog.level") - self.driver = DriverFactory.make(driver or Config.get("logging.channels.syslog.driver"))( - path=path, max_level=self.max_level - ) + self.max_level = Config.get('logging.channels.syslog.level') + self.driver = DriverFactory.make(driver or Config.get('logging.channels.syslog.driver'))(path=path, max_level=self.max_level) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/TerminalChannel.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/TerminalChannel.py index 2a4d19be..3586d47b 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/TerminalChannel.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/TerminalChannel.py @@ -1,12 +1,14 @@ +import os + +import pendulum from fastapi_startkit.facades import Config -from ..channels.BaseChannel import BaseChannel from ..factory import DriverFactory +from ..channels.BaseChannel import BaseChannel class TerminalChannel(BaseChannel): + def __init__(self, driver=None, path=None): - self.max_level = Config.get("logging.channels.terminal.level", "debug") - self.driver = DriverFactory.make(driver or Config.get("logging.channels.terminal.driver"))( - path=path, max_level=self.max_level - ) + self.max_level = Config.get('logging.channels.terminal.level', 'debug') + self.driver = DriverFactory.make(driver or Config.get('logging.channels.terminal.driver'))(path=path, max_level=self.max_level) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/channels/__init__.py b/fastapi_startkit/src/fastapi_startkit/logging/channels/__init__.py index 118a7b2d..bddca215 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/channels/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/channels/__init__.py @@ -1,8 +1,8 @@ -from .BaseChannel import BaseChannel -from .DailyChannel import DailyChannel -from .MultiBaseChannel import MultiBaseChannel from .SingleChannel import SingleChannel +from .TerminalChannel import TerminalChannel +from .DailyChannel import DailyChannel from .SlackChannel import SlackChannel -from .StackChannel import StackChannel from .SyslogChannel import SyslogChannel -from .TerminalChannel import TerminalChannel +from .StackChannel import StackChannel +from .BaseChannel import BaseChannel +from .MultiBaseChannel import MultiBaseChannel \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/logging/config/__init__.py b/fastapi_startkit/src/fastapi_startkit/logging/config/__init__.py index c436c9f8..f3e2cb3a 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/config/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/config/__init__.py @@ -1,2 +1,2 @@ -from .channels import DailyChannel, SingleChannel, SlackChannel, StackChannel, SyslogChannel, TerminalChannel +from .channels import SingleChannel, StackChannel, DailyChannel, TerminalChannel, SlackChannel, SyslogChannel from .logging import LoggingConfig diff --git a/fastapi_startkit/src/fastapi_startkit/logging/config/channels.py b/fastapi_startkit/src/fastapi_startkit/logging/config/channels.py index d935f45b..30ac62b1 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/config/channels.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/config/channels.py @@ -1,46 +1,43 @@ -from dataclasses import dataclass - +from pydantic.dataclasses import dataclass from pydantic.fields import Field - @dataclass class SingleChannel: - driver: str = "single" - level: str = "debug" - path: str = "storage/logs/single.log" + driver: str = 'single' + level: str = 'debug' + path: str = 'storage/logs/single.log' @dataclass class StackChannel: - driver: str = "stack" - channels: list = Field(default_factory=lambda: ["daily", "terminal"]) - + driver: str = 'stack' + channels: list = Field(default_factory=lambda: ['daily', 'terminal']) @dataclass class DailyChannel: - driver: str = "daily" - level: str = "debug" - path: str = "storage/logs" + driver: str = 'daily' + level: str = 'debug' + path: str = 'storage/logs' @dataclass class TerminalChannel: - driver: str = "terminal" - level: str = "info" + driver: str = 'terminal' + level: str = 'info' @dataclass class SlackChannel: - driver: str = "slack" - channel: str = "#bot" - emoji: str = ":warning:" - username: str = "Logging Bot" + driver: str = 'slack' + channel: str = '#bot' + emoji: str = ':warning:' + username: str = 'Logging Bot' token: str = None - level: str = "debug" + level: str = 'debug' @dataclass class SyslogChannel: - driver: str = "syslog" - path: str = "/var/run/syslog" - level: str = "debug" + driver: str = 'syslog' + path: str = '/var/run/syslog' + level: str = 'debug' diff --git a/fastapi_startkit/src/fastapi_startkit/logging/config/logging.py b/fastapi_startkit/src/fastapi_startkit/logging/config/logging.py index d651cf71..b63c47b9 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/config/logging.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/config/logging.py @@ -1,22 +1,23 @@ import dataclasses from fastapi_startkit.environment import env -from fastapi_startkit.logging.config import DailyChannel, StackChannel, TerminalChannel +from fastapi_startkit.logging.config import StackChannel, DailyChannel, TerminalChannel @dataclasses.dataclass class LoggingConfig: - default: str = dataclasses.field(default_factory=lambda: env("LOG_CHANNEL", "stack")) + default: str = dataclasses.field(default_factory=lambda: env('LOG_CHANNEL', 'stack')) - channels: dict = dataclasses.field( - default_factory=lambda: { - "stack": StackChannel(driver="stack", channels=["daily", "terminal"]), - "daily": DailyChannel( - level=env("LOG_DAILY_LEVEL", "debug"), - path=env("LOG_DAILY_PATH", "storage/logs"), - ), - "terminal": TerminalChannel( - level=env("LOG_TERMINAL_LEVEL", "info"), - ), - } - ) + channels: dict = dataclasses.field(default_factory=lambda: { + 'stack': StackChannel( + driver='stack', + channels=['daily', 'terminal'] + ), + 'daily': DailyChannel( + level=env('LOG_DAILY_LEVEL', 'debug'), + path=env('LOG_DAILY_PATH', 'storage/logs'), + ), + 'terminal': TerminalChannel( + level=env('LOG_TERMINAL_LEVEL', 'info'), + ), + }) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/drivers/BaseDriver.py b/fastapi_startkit/src/fastapi_startkit/logging/drivers/BaseDriver.py index 7435c354..2307a997 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/drivers/BaseDriver.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/drivers/BaseDriver.py @@ -1,22 +1,21 @@ import pendulum - from fastapi_startkit.facades import Config - class BaseDriver: + levels = [ - "emergency", - "alert", - "critical", - "error", - "warning", - "notice", - "info", - "debug", + 'emergency', + 'alert', + 'critical', + 'error', + 'warning', + 'notice', + 'info', + 'debug', ] def get_time(self): - return pendulum.now().in_tz(Config.get("logging.channels.timezone", "UTC")) + return pendulum.now().in_tz(Config.get('logging.channels.timezone', 'UTC')) def should_run(self, level, max_level): if not max_level: diff --git a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSingleDriver.py b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSingleDriver.py index 5a356db1..3914f931 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSingleDriver.py @@ -1,17 +1,17 @@ import logging - +import os from .BaseDriver import BaseDriver - class LogSingleDriver(BaseDriver): - def __init__(self, *args, **kwargs): - self.max_level = kwargs.get("max_level") - self.path = kwargs.get("path") - self.log = logging.getLogger("root") - handler = logging.FileHandler(self.path, "a") - formatter = logging.Formatter("{} - %(levelname)s - %(message)s".format(self.get_time().to_datetime_string())) + def __init__(self, *args, **kwargs): + self.max_level = kwargs.get('max_level') + self.path = kwargs.get('path') + self.log = logging.getLogger('root') + handler = logging.FileHandler(self.path, 'a') + formatter = logging.Formatter('{} - %(levelname)s - %(message)s'.format(self.get_time().to_datetime_string())) + handler.setFormatter(formatter) self.log.addHandler(handler) @@ -19,49 +19,66 @@ def change_format(self, changed_format): for hdlr in self.log.handlers[:]: # remove all old handlers self.log.removeHandler(hdlr) - handler = logging.FileHandler(self.path, "a") + handler = logging.FileHandler(self.path, 'a') formatter = logging.Formatter(changed_format) - + handler.setFormatter(formatter) self.log.addHandler(handler) def emergency(self, message, *args, **kwargs): self.log.setLevel(logging.CRITICAL) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "EMERGENCY")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'EMERGENCY')) return self.log.critical(message) def alert(self, message, *args, **kwargs): self.log.setLevel(logging.CRITICAL) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "ALERT")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'ALERT')) return self.log.critical(message) def critical(self, message, *args, **kwargs): self.log.setLevel(logging.CRITICAL) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "CRITICAL")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'CRITICAL')) return self.log.critical(message) def error(self, message, *args, **kwargs): self.log.setLevel(logging.ERROR) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "ERROR")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'ERROR')) return self.log.error(message) def warning(self, message, *args, **kwargs): self.log.setLevel(logging.WARNING) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "WARNING")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'WARNING')) return self.log.warning(message) def notice(self, message, *args, **kwargs): self.log.setLevel(logging.INFO) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "NOTICE")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'NOTICE')) return self.log.info(message) def info(self, message, *args, **kwargs): self.log.setLevel(logging.INFO) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "INFO")) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'INFO')) return self.log.info(message) def debug(self, message, *args, **kwargs): self.log.setLevel(logging.DEBUG) - self.change_format("{} - {} - %(message)s".format(self.get_time().to_datetime_string(), "DEBUG")) - return self.log.debug(message) + self.change_format('{} - {} - %(message)s'.format( + self.get_time().to_datetime_string(), + 'DEBUG')) + return self.log.debug(message) + \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSlackDriver.py b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSlackDriver.py index ebcd03e4..4f87256b 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSlackDriver.py @@ -1,63 +1,78 @@ -import requests - +import os from .BaseDriver import BaseDriver - +import requests class LogSlackDriver(BaseDriver): + def __init__(self, *args, **kwargs): - self.slack_url = "https://slack.com/api/chat.postMessage" - self.token = kwargs.get("token") - self.channel = kwargs.get("channel") - self.emoji = kwargs.get("emoji", ":warning:") - self.username = kwargs.get("username") + self.slack_url = 'https://slack.com/api/chat.postMessage' + self.token = kwargs.get('token') + self.channel = kwargs.get('channel') + self.emoji = kwargs.get('emoji', ':warning:') + self.username = kwargs.get('username') def emergency(self, message, *args, **kwargs): - self.send(self.get_format(message, "EMERGENCY")) + self.send( + self.get_format(message, 'EMERGENCY') + ) def alert(self, message, *args, **kwargs): - self.send(self.get_format(message, "ALERT")) + self.send( + self.get_format(message, 'ALERT') + ) def critical(self, message, *args, **kwargs): - self.send(self.get_format(message, "CRITICAL")) + self.send( + self.get_format(message, 'CRITICAL') + ) def error(self, message, *args, **kwargs): - self.send(self.get_format(message, "ERROR")) + self.send( + self.get_format(message, 'ERROR') + ) def warning(self, message, *args, **kwargs): - self.send(self.get_format(message, "WARNING")) + self.send( + self.get_format(message, 'WARNING') + ) def notice(self, message, *args, **kwargs): - self.send(self.get_format(message, "NOTICE")) + self.send( + self.get_format(message, 'NOTICE') + ) def info(self, message, *args, **kwargs): - self.send(self.get_format(message, "INFO")) + self.send( + self.get_format(message, 'INFO') + ) def debug(self, message, *args, **kwargs): - self.send(self.get_format(message, "DEBUG")) + self.send( + self.get_format(message, 'DEBUG') + ) def get_format(self, message, level): return "{time} - {level} - {message}".format( - time=self.get_time().to_datetime_string(), message=message, level=level + time=self.get_time().to_datetime_string(), + message=message, + level=level ) def send(self, message): - requests.post( - self.slack_url, - { - "token": self.token, - "channel": self.find_channel(self.channel), - "text": message, - "username": self.username, - "icon_emoji": self.emoji, - "as_user": False, - "reply_broadcast": True, - "unfurl_links": True, - "unfurl_media": True, - }, - ) + requests.post(self.slack_url, { + 'token': self.token, + 'channel': self.find_channel(self.channel), + 'text': message, + 'username': self.username, + 'icon_emoji': self.emoji, + 'as_user': False, + 'reply_broadcast': True, + 'unfurl_links': True, + 'unfurl_media': True, + }) def find_channel(self, name): - """Calls the Slack API to find the channel name. + """Calls the Slack API to find the channel name. This is so we do not have to specify the channel ID's. Slack requires channel ID's to be used. Arguments: @@ -67,10 +82,13 @@ def find_channel(self, name): Returns: self """ - response = requests.post("https://slack.com/api/channels.list", {"token": self.token}) + response = requests.post('https://slack.com/api/channels.list', { + 'token': self.token + }) - for channel in response.json()["channels"]: - if channel["name"] == name.split("#")[1]: - return channel["id"] + for channel in response.json()['channels']: + if channel['name'] == name.split('#')[1]: + return channel['id'] - raise SlackChannelNotFound("Could not find the {} channel".format(name)) + raise SlackChannelNotFound( + 'Could not find the {} channel'.format(name)) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py index a68cc3f0..4f75e3a2 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py @@ -1,17 +1,16 @@ +from .BaseDriver import BaseDriver import logging import logging.handlers -from .BaseDriver import BaseDriver - - class LogSyslogDriver(BaseDriver): - def __init__(self, *args, **kwargs): - self.log = logging.getLogger("root") - path = kwargs.get("path") - handler = logging.handlers.SysLogHandler(address=path) + def __init__(self, *args, **kwargs): + self.log = logging.getLogger('root') + path = kwargs.get('path') + + handler = logging.handlers.SysLogHandler(address = path) - formatter = logging.Formatter("{} - %(levelname)s - %(message)s".format(self.get_time().to_datetime_string())) + formatter = logging.Formatter('{} - %(levelname)s - %(message)s'.format(self.get_time().to_datetime_string())) handler.setFormatter(formatter) self.log.addHandler(handler) @@ -46,4 +45,4 @@ def info(self, message): def debug(self, message): self.log.setLevel(logging.DEBUG) - return self.log.debug(message) + return self.log.debug(message) \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py index 3c929fc8..89d24a0a 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py @@ -1,39 +1,60 @@ # from logging import Logger +import os +from fastapi_startkit.facades import Config from fastapi_startkit.utils.console import HasColoredOutput from .BaseDriver import BaseDriver class LogTerminalDriver(BaseDriver, HasColoredOutput): + def __init__(self, *args, **kwargs): pass def emergency(self, message): - super().warning(self.get_format(message, "EMERGENCY")) + super().warning( + self.get_format(message, 'EMERGENCY') + ) def alert(self, message): - super().warning(self.get_format(message, "ALERT")) + super().warning( + self.get_format(message, 'ALERT') + ) def critical(self, message): - super().warning(self.get_format(message, "CRITICAL")) + super().warning( + self.get_format(message, 'CRITICAL') + ) def error(self, message): - super().warning(self.get_format(message, "ERROR")) + super().warning( + self.get_format(message, 'ERROR') + ) def warning(self, message): - super().warning(self.get_format(message, "WARNING")) + super().warning( + self.get_format(message, 'WARNING') + ) def notice(self, message): - super().warning(self.get_format(message, "NOTICE")) + super().warning( + self.get_format(message, 'NOTICE') + ) def info(self, message): - super().warning(self.get_format(message, "INFO")) + super().warning( + self.get_format(message, 'INFO') + ) def debug(self, message): - super().warning(self.get_format(message, "DEBUG")) + super().warning( + self.get_format(message, 'DEBUG') + ) def get_format(self, message, level): - return "{time} - {level} - {message}".format( - time=self.get_time().to_datetime_string(), level=level, message=message - ) + return '{time} - {level} - {message}'.format( + time=self.get_time().to_datetime_string(), + level=level, + message=message + ) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/drivers/__init__.py b/fastapi_startkit/src/fastapi_startkit/logging/drivers/__init__.py index 45e2c4bb..2c2876d4 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/drivers/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/drivers/__init__.py @@ -1,5 +1,5 @@ -from .BaseDriver import BaseDriver from .LogSingleDriver import LogSingleDriver +from .LogTerminalDriver import LogTerminalDriver from .LogSlackDriver import LogSlackDriver from .LogSyslogDriver import LogSyslogDriver -from .LogTerminalDriver import LogTerminalDriver +from .BaseDriver import BaseDriver \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/logging/factory.py b/fastapi_startkit/src/fastapi_startkit/logging/factory.py index e98d2cb9..381eb431 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/factory.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/factory.py @@ -1,15 +1,14 @@ -from .drivers import LogSingleDriver, LogSlackDriver, LogSyslogDriver, LogTerminalDriver - - +from .drivers import LogSingleDriver, LogTerminalDriver, LogSlackDriver, LogSyslogDriver class DriverFactory: drivers = { - "single": LogSingleDriver, - "daily": LogSingleDriver, - "slack": LogSlackDriver, - "syslog": LogSyslogDriver, - "terminal": LogTerminalDriver, + 'single': LogSingleDriver, + 'daily': LogSingleDriver, + 'slack': LogSlackDriver, + 'syslog': LogSyslogDriver, + 'terminal': LogTerminalDriver } @classmethod def make(cls, driver): return cls.drivers.get(driver) + diff --git a/fastapi_startkit/src/fastapi_startkit/logging/handler.py b/fastapi_startkit/src/fastapi_startkit/logging/handler.py index c6ee368e..65766bb5 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/handler.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/handler.py @@ -4,7 +4,6 @@ class LoggingHandler(logging.Handler): def emit(self, record: logging.LogRecord) -> None: from fastapi_startkit.logging.logger import Logger - Logger.log(record.levelname, self.format(record)) @staticmethod diff --git a/fastapi_startkit/src/fastapi_startkit/logging/listeners.py b/fastapi_startkit/src/fastapi_startkit/logging/listeners.py index 77c72517..58aa033e 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/listeners.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/listeners.py @@ -1,11 +1,15 @@ from .logger import Logger - class LoggerExceptionListener: - listens = ["*"] + + listens = ['*'] def __init__(self, logger: Logger): self.logger = logger def handle(self, exception, file, line): - self.logger.error("{} in {} on line {}".format(exception.__class__.__name__, file, line)) + self.logger.error("{} in {} on line {}".format( + exception.__class__.__name__, + file, + line + )) diff --git a/fastapi_startkit/src/fastapi_startkit/logging/logger.py b/fastapi_startkit/src/fastapi_startkit/logging/logger.py index acda44a1..7fa5e5e2 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/logger.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/logger.py @@ -3,13 +3,12 @@ from fastapi_startkit.application import app from fastapi_startkit.logging.channels import BaseChannel - class Logger: instance = None def __init__(self): self.app = app() - self.logger: BaseChannel = self.app.make("logger") + self.logger: BaseChannel = self.app.make('logger') @classmethod def logger_info(cls) -> str: @@ -22,7 +21,7 @@ def logger_info(cls) -> str: return "" filename = frame.filename lineno = frame.lineno - return f"{filename}:{str(lineno)} - " + return f'{filename}:{str(lineno)} - ' @classmethod def init(cls) -> BaseChannel: diff --git a/fastapi_startkit/src/fastapi_startkit/logging/managers/LoggingManager.py b/fastapi_startkit/src/fastapi_startkit/logging/managers/LoggingManager.py index dba68f24..dfb9e9d6 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/managers/LoggingManager.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/managers/LoggingManager.py @@ -10,5 +10,4 @@ def channel(self, channel): @classmethod def configure_python_logging(cls): from ..handler import LoggingHandler - LoggingHandler.install() diff --git a/fastapi_startkit/src/fastapi_startkit/logging/managers/__init__.py b/fastapi_startkit/src/fastapi_startkit/logging/managers/__init__.py index 5e680811..3ea9c655 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/managers/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/managers/__init__.py @@ -1 +1 @@ -from .LoggingManager import LoggingManager +from .LoggingManager import LoggingManager \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/logging/providers/log_provider.py b/fastapi_startkit/src/fastapi_startkit/logging/providers/log_provider.py index 1d361416..722f1bcf 100644 --- a/fastapi_startkit/src/fastapi_startkit/logging/providers/log_provider.py +++ b/fastapi_startkit/src/fastapi_startkit/logging/providers/log_provider.py @@ -1,7 +1,7 @@ +import os from pathlib import Path from fastapi_startkit.providers import Provider - from ..ChannelFactory import ChannelFactory from ..config.logging import LoggingConfig from ..factory import DriverFactory @@ -10,23 +10,25 @@ class LogProvider(Provider): - provider_key = "logging" + provider_key = 'logging' def register(self): config = self.resolve_config(LoggingConfig) self.merge_config_from(config, self.provider_key) - self.app.bind("LogChannelFactory", ChannelFactory) - self.app.bind("LogDriverFactory", DriverFactory) - self.app.bind("LoggingManager", LoggingManager(ChannelFactory, DriverFactory)) + self.app.bind('LogChannelFactory', ChannelFactory) + self.app.bind('LogDriverFactory', DriverFactory) + self.app.bind('LoggingManager', LoggingManager(ChannelFactory, DriverFactory)) def boot(self): - self.publishes({Path(__file__).resolve().parent.parent.joinpath("config/logging.py"): "config/logging.py"}) - config = self.app.make("config") - if not config.get("logging.default"): + self.publishes({ + Path(__file__).resolve().parent.parent.joinpath('config/logging.py'): 'config/logging.py' + }) + config = self.app.make('config') + if not config.get('logging.default'): return - logger = self.app.make("LoggingManager") - channel = logger.channel(config.get("logging.default")) + logger = self.app.make('LoggingManager') + channel = logger.channel(config.get('logging.default')) - self.app.bind("logger", channel) + self.app.bind('logger', channel) self.app.swap(Logger, channel) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/__init__.py index 056f7152..a18a46cf 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/__init__.py @@ -1,2 +1,2 @@ -from .models.fields import Field from .models.model import Model +from .models.fields import Field diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config.py index 2a5228ff..e105fb00 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config.py @@ -1,5 +1,6 @@ import os import pydoc +import sys import urllib.parse as urlparse from .exceptions import ConfigurationNotFound, InvalidUrlConfiguration @@ -11,16 +12,22 @@ def load_config(config_path=None): 1. try to load from DB_CONFIG_PATH environment variable 2. else try to load from default config_path: config/database """ - selected_config_path = os.getenv("DB_CONFIG_PATH", config_path) or "config/database" + selected_config_path = ( + os.getenv("DB_CONFIG_PATH", config_path) or "config/database" + ) os.environ["DB_CONFIG_PATH"] = selected_config_path # format path as python module if needed - selected_config_path = selected_config_path.replace("/", ".").replace("\\", ".").rstrip(".py") + selected_config_path = ( + selected_config_path.replace("/", ".").replace("\\", ".").rstrip(".py") + ) config_module = pydoc.locate(selected_config_path) if config_module is None: - raise ConfigurationNotFound(f"ORM configuration file has not been found in {selected_config_path}") + raise ConfigurationNotFound( + f"ORM configuration file has not been found in {selected_config_path}" + ) return config_module @@ -91,7 +98,11 @@ def db_url(database_url=None, prefix="", options={}, log_queries=False): # lookup specified driver driver = DRIVERS_MAP[url.scheme] - port = str(url.port) if url.port and driver in [DRIVERS_MAP["mssql"]] else url.port + port = ( + str(url.port) + if url.port and driver in [DRIVERS_MAP["mssql"]] + else url.port + ) # build final configuration config = { diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config/database.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config/database.py index 353dd3b0..038513b0 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config/database.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/config/database.py @@ -12,7 +12,7 @@ "log_queries": False, "options": { # - }, + } }, "postgres": { "host": "127.0.0.1", @@ -24,14 +24,14 @@ "log_queries": False, "options": { # - }, + } }, "sqlite": { "driver": "sqlite", "database": "masonite.sqlite3", - }, + } } -MIGRATION_PATH = "databases/migrations" +MIGRATION_PATH = 'databases/migrations' -SEEDER_PATH = "databases/seeders" +SEEDER_PATH = 'databases/seeders' diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py index aed8fcdb..83f24115 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py @@ -11,7 +11,9 @@ def faker(self): try: from faker import Faker except ImportError: - raise ImportError("Could not find the 'faker' library. Run 'pip install faker' to fix this.") + raise ImportError( + "Could not find the 'faker' library. Run 'pip install faker' to fix this." + ) if not Factory._faker: Factory._faker = Faker() diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py index 3779ffcf..b654dbc7 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py @@ -98,9 +98,13 @@ def on(self, connection_key): if connection_detail: self._connection_driver = connection_detail.get("driver") else: - raise ConnectionNotRegistered(f"Could not find the '{connection_key}' connection details") + raise ConnectionNotRegistered( + f"Could not find the '{connection_key}' connection details" + ) - self.connection_class = resolver._drivers.get(self._connection_driver) + self.connection_class = resolver._drivers.get( + self._connection_driver + ) return self @@ -183,13 +187,27 @@ async def table(self, table): def get_connection_information(self): return { - "host": self.connection_details.get(self.connection, {}).get("host"), - "database": self.connection_details.get(self.connection, {}).get("database"), - "user": self.connection_details.get(self.connection, {}).get("user"), - "port": self.connection_details.get(self.connection, {}).get("port"), - "password": self.connection_details.get(self.connection, {}).get("password"), - "prefix": self.connection_details.get(self.connection, {}).get("prefix"), - "options": self.connection_details.get(self.connection, {}).get("options", {}), + "host": self.connection_details.get(self.connection, {}).get( + "host" + ), + "database": self.connection_details.get(self.connection, {}).get( + "database" + ), + "user": self.connection_details.get(self.connection, {}).get( + "user" + ), + "port": self.connection_details.get(self.connection, {}).get( + "port" + ), + "password": self.connection_details.get(self.connection, {}).get( + "password" + ), + "prefix": self.connection_details.get(self.connection, {}).get( + "prefix" + ), + "options": self.connection_details.get(self.connection, {}).get( + "options", {} + ), "full_details": self.connection_details.get(self.connection), } @@ -225,7 +243,9 @@ async def has_column(self, table, column, query_only=False): return bool(await (await self.new_connection()).query(sql, ())) async def get_columns(self, table, dict=True): - table = self.platform().get_current_schema(await self.new_connection(), table, schema=self.get_schema()) + table = self.platform().get_current_schema( + await self.new_connection(), table, schema=self.get_schema() + ) result = {} if dict: for column in table.get_added_columns().items(): @@ -270,7 +290,9 @@ async def rename(self, table, new_name): return bool(await (await self.new_connection()).query(sql, ())) async def truncate(self, table, foreign_keys=False): - sql = self.platform().compile_truncate(table, foreign_keys=foreign_keys) + sql = self.platform().compile_truncate( + table, foreign_keys=foreign_keys + ) if self._dry: self._sql = sql @@ -280,7 +302,9 @@ async def truncate(self, table, foreign_keys=False): def get_schema(self): """Gets the schema set on the migration class""" - return self.schema or self.get_connection_information().get("full_details").get("schema") + return self.schema or self.get_connection_information().get( + "full_details" + ).get("schema") async def get_all_tables(self): """Gets all tables in the database""" @@ -295,7 +319,9 @@ async def get_all_tables(self): result = await (await self.new_connection()).query(sql, ()) - return list(map(lambda t: list(t.values())[0], result)) if result else [] + return ( + list(map(lambda t: list(t.values())[0], result)) if result else [] + ) async def has_table(self, table, query_only=False): """Checks if the a database has a specific table diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py index 2b6ea510..2f749d29 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py @@ -8,7 +8,9 @@ def __init__(self, deleted_at_column="deleted_at"): self.deleted_at_column = deleted_at_column def on_boot(self, builder): - builder.set_global_scope("_where_null", self._where_null, action="select") + builder.set_global_scope( + "_where_null", self._where_null, action="select" + ) builder.set_global_scope( "_query_set_null_on_delete", self._query_set_null_on_delete, @@ -21,10 +23,14 @@ def on_boot(self, builder): def on_remove(self, builder): builder.remove_global_scope("_where_null", action="select") - builder.remove_global_scope("_query_set_null_on_delete", action="delete") + builder.remove_global_scope( + "_query_set_null_on_delete", action="delete" + ) def _where_null(self, builder): - return builder.where_null(f"{builder.get_table_name()}.{self.deleted_at_column}") + return builder.where_null( + f"{builder.get_table_name()}.{self.deleted_at_column}" + ) def _with_trashed(self, model, builder): builder.remove_global_scope("_where_null", action="select") @@ -40,7 +46,9 @@ def _force_delete(self, model, builder, query=False): return builder.remove_global_scope(self).delete() def _restore(self, model, builder): - return builder.remove_global_scope(self).update({self.deleted_at_column: None}) + return builder.remove_global_scope(self).update( + {self.deleted_at_column: None} + ) def _query_set_null_on_delete(self, builder): return builder.set_action("update").set_updates( diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py index 30b4bee4..96e26b7c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py @@ -7,7 +7,9 @@ class UUIDPrimaryKeyScope(BaseScope): """Global scope class to use UUID4 as primary key.""" def on_boot(self, builder): - builder.set_global_scope("_UUID_primary_key", self.set_uuid_create, action="insert") + builder.set_global_scope( + "_UUID_primary_key", self.set_uuid_create, action="insert" + ) builder.set_global_scope( "_UUID_primary_key", self.set_bulk_uuid_create, @@ -32,7 +34,11 @@ def generate_uuid(self, builder, uuid_version, bytes=False): def build_uuid_pk(self, builder): uuid_version = getattr(builder._model, "__uuid_version__", 4) uuid_bytes = getattr(builder._model, "__uuid_bytes__", False) - return {builder._model.__primary_key__: self.generate_uuid(builder, uuid_version, uuid_bytes)} + return { + builder._model.__primary_key__: self.generate_uuid( + builder, uuid_version, uuid_bytes + ) + } def set_uuid_create(self, builder): # if there is already a primary key, no need to set a new one diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py index b3035306..63b479bc 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py @@ -25,139 +25,228 @@ def setUp(self): def test_can_compile_select(self): to_sql = self.builder.to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_order_by_and_first(self): to_sql = self.builder.order_by("id", "asc").first(query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_columns(self): to_sql = self.builder.select("username", "password").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_where(self): - to_sql = self.builder.select("username", "password").where("id", 1).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username", "password").where("id", 1).to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_or_where(self): to_sql = self.builder.where("name", 2).or_where("name", 3).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_grouped_where(self): - to_sql = self.builder.where(lambda query: query.where("age", 2).where("name", "Joe")).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.where( + lambda query: query.where("age", 2).where("name", "Joe") + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_several_where(self): - to_sql = self.builder.select("username", "password").where("id", 1).where("username", "joe").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username", "password") + .where("id", 1) + .where("username", "joe") + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_several_where_and_limit(self): - to_sql = self.builder.select("username", "password").where("id", 1).where("username", "joe").limit(10).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username", "password") + .where("id", 1) + .where("username", "joe") + .limit(10) + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_sum(self): to_sql = self.builder.sum("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_max(self): to_sql = self.builder.max("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_max_and_columns(self): to_sql = self.builder.select("username").max("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_max_and_columns_different_order(self): to_sql = self.builder.max("age").select("username").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_order_by(self): - to_sql = self.builder.select("username").order_by("age", "desc").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username").order_by("age", "desc").to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_multiple_order_by(self): - to_sql = self.builder.select("username").order_by("age", "desc").order_by("name").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username") + .order_by("age", "desc") + .order_by("name") + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_with_group_by(self): to_sql = self.builder.select("username").group_by("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_in(self): - to_sql = self.builder.select("username").where_in("age", [1, 2, 3]).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username").where_in("age", [1, 2, 3]).to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_in_empty(self): to_sql = self.builder.where_in("age", []).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_not_in(self): - to_sql = self.builder.select("username").where_not_in("age", [1, 2, 3]).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.select("username") + .where_not_in("age", [1, 2, 3]) + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_null(self): to_sql = self.builder.select("username").where_null("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_not_null(self): to_sql = self.builder.select("username").where_not_null("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_count(self): to_sql = self.builder.count("*").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_count_column(self): to_sql = self.builder.count("money").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_column(self): to_sql = self.builder.where_column("name", "email").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_sub_select(self): - to_sql = self.builder.where_in("name", self.builder.new().select("age")).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.where_in( + "name", self.builder.new().select("age") + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_complex_sub_select(self): to_sql = self.builder.where_in( "name", - (self.builder.new().select("age").where_in("email", self.builder.new().select("email"))), + ( + self.builder.new() + .select("age") + .where_in("email", self.builder.new().select("email")) + ), ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_sub_select_where(self): to_sql = self.builder.where_in( "age", - self.builder.new().select("age").where("age", 2).where("name", "Joe"), + self.builder.new() + .select("age") + .where("age", 2) + .where("name", "Joe"), ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_sub_select_from_lambda(self): @@ -165,7 +254,9 @@ def test_can_compile_sub_select_from_lambda(self): self.builder.new() .where_in( "age", - lambda q: q.select("age").where("age", 2).where("name", "Joe"), + lambda q: ( + q.select("age").where("age", 2).where("name", "Joe") + ), ) .to_sql() ) @@ -173,42 +264,75 @@ def test_can_compile_sub_select_from_lambda(self): self.assertEqual(to_sql, sql) def test_can_compile_sub_select_value(self): - to_sql = self.builder.where("name", self.builder.new().sum("age")).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.where( + "name", self.builder.new().sum("age") + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_exists(self): to_sql = ( - self.builder.select("age").where_exists(self.builder.new().select("username").where("age", 12)).to_sql() + self.builder.select("age") + .where_exists( + self.builder.new().select("username").where("age", 12) + ) + .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_not_exists(self): to_sql = ( - self.builder.select("age").where_not_exists(self.builder.new().select("username").where("age", 12)).to_sql() + self.builder.select("age") + .where_not_exists( + self.builder.new().select("username").where("age", 12) + ) + .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_having(self): to_sql = self.builder.sum("age").group_by("age").having("age").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_having_with_expression(self): - to_sql = self.builder.sum("age").group_by("age").having("age", 10).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.sum("age").group_by("age").having("age", 10).to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_having_with_greater_than_expression(self): - to_sql = self.builder.sum("age").group_by("age").having("age", ">", 10).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.sum("age") + .group_by("age") + .having("age", ">", 10) + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_join(self): - to_sql = self.builder.join("contacts", "users.id", "=", "contacts.user_id").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.join( + "contacts", "users.id", "=", "contacts.user_id" + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_join_clause(self): @@ -221,62 +345,98 @@ def test_can_compile_join_clause(self): ) to_sql = self.builder.join(clause).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_join_clause_with_value(self): - clause = JoinClause("report_groups as rg").on_value("bgt.active", "=", "1").or_on_value("bgt.acct", "=", "1234") + clause = ( + JoinClause("report_groups as rg") + .on_value("bgt.active", "=", "1") + .or_on_value("bgt.acct", "=", "1234") + ) to_sql = self.builder.join(clause).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_join_clause_with_null(self): - clause = JoinClause("report_groups as rg").on_null("bgt.acct").or_on_null("bgt.dept").on_value("rg.abc", 10) + clause = ( + JoinClause("report_groups as rg") + .on_null("bgt.acct") + .or_on_null("bgt.dept") + .on_value("rg.abc", 10) + ) to_sql = self.builder.join(clause).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_join_clause_with_not_null(self): clause = ( - JoinClause("report_groups as rg").on_not_null("bgt.acct").or_on_not_null("bgt.dept").on_value("rg.abc", 10) + JoinClause("report_groups as rg") + .on_not_null("bgt.acct") + .or_on_not_null("bgt.dept") + .on_value("rg.abc", 10) ) to_sql = self.builder.join(clause).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_join_clause_with_lambda(self): to_sql = self.builder.join( "report_groups as rg", - lambda clause: clause.on("bgt.fund", "=", "rg.fund").on_null("bgt"), + lambda clause: ( + clause.on("bgt.fund", "=", "rg.fund").on_null("bgt") + ), ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_left_join_clause_with_lambda(self): to_sql = self.builder.left_join( "report_groups as rg", - lambda clause: clause.on("bgt.fund", "=", "rg.fund").or_on_null("bgt"), + lambda clause: ( + clause.on("bgt.fund", "=", "rg.fund").or_on_null("bgt") + ), ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_right_join_clause_with_lambda(self): to_sql = self.builder.right_join( "report_groups as rg", - lambda clause: clause.on("bgt.fund", "=", "rg.fund").or_on_null("bgt"), + lambda clause: ( + clause.on("bgt.fund", "=", "rg.fund").or_on_null("bgt") + ), ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_left_join(self): - to_sql = self.builder.left_join("contacts", "users.id", "=", "contacts.user_id").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.left_join( + "contacts", "users.id", "=", "contacts.user_id" + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_multiple_join(self): @@ -285,93 +445,149 @@ def test_can_compile_multiple_join(self): .join("posts", "comments.post_id", "=", "posts.id") .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_limit_and_offset(self): to_sql = self.builder.limit(10).offset(10).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_between(self): to_sql = self.builder.between("age", 18, 21).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_not_between(self): to_sql = self.builder.not_between("age", 18, 21).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_user_where_raw_and_where(self): - to_sql = self.builder.where_raw("age = '18'").where("name", "=", "James").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where_raw("age = '18'") + .where("name", "=", "James") + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_where_raw_and_where_with_multiple_bindings(self): - query = self.builder.where_raw("`age` = ? AND `is_admin` = ?", [18, True]).where("email", "test@example.com") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + query = self.builder.where_raw( + "`age` = ? AND `is_admin` = ?", [18, True] + ).where("email", "test@example.com") + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(query.to_qmark(), sql) self.assertEqual(query._bindings, [18, True, "test@example.com"]) def test_can_compile_first_or_fail(self): - to_sql = self.builder.where("is_admin", "=", True).first_or_fail(query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where("is_admin", "=", True) + .first_or_fail(query=True) + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_where_like(self): to_sql = self.builder.where("age", "like", "%name%").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_where_regexp(self): to_sql = self.builder.where("age", "regexp", "Joe").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_where_exists_with_lambda(self): - to_sql = self.builder.where_exists(lambda q: q.where("age", 1)).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.where_exists( + lambda q: q.where("age", 1) + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() print(to_sql) self.assertEqual(to_sql, sql) def test_where_not_exists_with_lambda(self): - to_sql = self.builder.where_not_exists(lambda q: q.where("age", 1)).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = self.builder.where_not_exists( + lambda q: q.where("age", 1) + ).to_sql() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() print(to_sql) self.assertEqual(to_sql, sql) def test_where_not_regexp(self): to_sql = self.builder.where("age", "not regexp", "Joe").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_where_not_like(self): to_sql = self.builder.where("age", "not like", "%name%").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_shared_lock(self): to_sql = self.builder.where("votes", ">=", 100).shared_lock().to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_update_lock(self): - to_sql = self.builder.where("votes", ">=", 100).lock_for_update().to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where("votes", ">=", 100).lock_for_update().to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_where_date(self): to_sql = self.builder.where_date("created_at", "2022-06-01").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_or_where_null(self): - to_sql = self.builder.where_null("column1").or_where_null("column2").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where_null("column1") + .or_where_null("column2") + .to_sql() + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_select_distinct(self): to_sql = self.builder.select("group").distinct().to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/Database.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/Database.py index 250368d8..9718d7ee 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/Database.py @@ -1,8 +1,8 @@ +import os from ..config import load_config from ..migrations import Migration from ..seeds import Seeder - class Database: _migrated = False migration_directory = "databases/migrations" @@ -13,7 +13,9 @@ async def setUpDatabase(self): Run migrations once per test suite. """ if not Database._migrated: - migration = Migration(migration_directory=self.migration_directory) + migration = Migration( + migration_directory=self.migration_directory + ) await migration.create_table_if_not_exists() await migration.migrate() Database._migrated = True @@ -27,7 +29,7 @@ async def beginTransaction(self): self._session = resolver.get_session_factory()() await self._session.__aenter__() self._transaction = await self._session.begin() - + # Make this session "sticky" so QueryBuilder uses it resolver.set_sticky_session(self._session) @@ -37,14 +39,14 @@ async def rollbackTransaction(self): """ resolver = load_config().DB resolver.remove_sticky_session() - + if hasattr(self, "_transaction"): try: await self._transaction.rollback() except Exception: # Transaction might already be closed or inactive pass - + if hasattr(self, "_session"): await self._session.__aexit__(None, None, None) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py index a95bc653..a2d8b466 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py @@ -1,8 +1,6 @@ from unittest import IsolatedAsyncioTestCase - from .Database import Database - class TestCase(IsolatedAsyncioTestCase, Database): async def asyncSetUp(self): await self.setUpDatabase() diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py index 658eb527..bca81271 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py @@ -1,2 +1,2 @@ -from .Database import Database from .TestCase import TestCase +from .Database import Database diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/User.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/User.py index 8ed65118..fa2db583 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/User.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/User.py @@ -1,4 +1,4 @@ -"""User Model""" +""" User Model """ from fastapi_startkit.masoniteorm.models import Model diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/collection/test_collection.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/collection/test_collection.py index ccfbc85d..fec8d5fa 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/collection/test_collection.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/collection/test_collection.py @@ -1,14 +1,13 @@ -import os import unittest - -from fastapi_startkit.masoniteorm.factories import Factory as factory -from fastapi_startkit.masoniteorm.tests.integrations.config.database import DATABASES -from fastapi_startkit.masoniteorm.tests.User import User +import os from fastapi_startkit.masoniteorm.collection import Collection +from fastapi_startkit.masoniteorm.factories import Factory as factory from fastapi_startkit.masoniteorm.models import Model from fastapi_startkit.masoniteorm.schema import Schema from fastapi_startkit.masoniteorm.schema.platforms import SQLitePlatform +from fastapi_startkit.masoniteorm.tests.User import User +from fastapi_startkit.masoniteorm.tests.integrations.config.database import DATABASES class TestCollection(unittest.IsolatedAsyncioTestCase): @@ -269,7 +268,9 @@ def test_count(self): collection = Collection([1, 1, 2, 4]) self.assertEqual(collection.count(), 4) - collection = Collection([{"name": "Corentin All", "age": 1}, {"name": "Corentin All", "age": 2}]) + collection = Collection( + [{"name": "Corentin All", "age": 1}, {"name": "Corentin All", "age": 2}] + ) self.assertEqual(collection.count(), 2) def test_chunk(self): @@ -323,8 +324,7 @@ def test_merge(self): self.assertEqual(collection.all(), [[1, 1], [2, 4], [2, 1]]) def test_reduce(self): - def callback(x, y): - return x + y + callback = lambda x, y: x + y collection = Collection([1, 1, 2, 4]) sum = collection.sum() @@ -390,7 +390,9 @@ def test_reject(self): collection.reject(lambda x: x if x["age"] > 2 else None) self.assertEqual( - Collection([{"name": "Corentin All", "age": 3}, {"name": "Corentin All", "age": 4}]), + Collection( + [{"name": "Corentin All", "age": 3}, {"name": "Corentin All", "age": 4}] + ), collection.all(), ) @@ -531,7 +533,9 @@ def test_implode(self): result = collection.implode("-") self.assertEqual(result, "1-2-3-4") - collection = Collection([{"name": "Corentin"}, {"name": "Joe"}, {"name": "Marlysson"}]) + collection = Collection( + [{"name": "Corentin"}, {"name": "Joe"}, {"name": "Marlysson"}] + ) result = collection.implode(key="name") self.assertEqual(result, "Corentin,Joe,Marlysson") @@ -546,7 +550,9 @@ def __eq__(self, other): return self.code == other.code currencies = collection.map_into(Currency) - self.assertEqual(currencies.all(), [Currency("USD"), Currency("EUR"), Currency("GBP")]) + self.assertEqual( + currencies.all(), [Currency("USD"), Currency("EUR"), Currency("GBP")] + ) def test_map(self): collection = Collection([1, 2, 3, 4]) @@ -618,7 +624,8 @@ def test_json(self): self.assertEqual( json_data, - '[{"name": "Corentin", "age": 10}, {"name": "Joe", "age": 20}, {"name": "Marlysson", "age": 15}]', + '[{"name": "Corentin", "age": 10}, ' + '{"name": "Joe", "age": 20}, {"name": "Marlysson", "age": 15}]', ) def test_contains(self): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/commands/test_shell.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/commands/test_shell.py index 7d18f371..50735da0 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/commands/test_shell.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/commands/test_shell.py @@ -1,5 +1,4 @@ import unittest - from cleo.testers.command_tester import CommandTester from fastapi_startkit.masoniteorm.commands import ShellCommand @@ -63,7 +62,10 @@ def test_for_mssql(self): "full_details": {"driver": "mssql"}, } command, _ = self.command.get_command(config) - assert command == "sqlcmd -d orm -U root -P secretpostgres -S tcp:db.masonite.com,1234" + assert ( + command + == "sqlcmd -d orm -U root -P secretpostgres -S tcp:db.masonite.com,1234" + ) def test_running_command_with_sqlite(self): self.command_tester.execute("-c dev") @@ -82,4 +84,6 @@ def test_hiding_sensitive_options(self): } command, _ = self.command.get_command(config) cleaned_command = self.command.hide_sensitive_options(config, command) - assert cleaned_command == "mysql orm --host localhost --user root --password ***" + assert ( + cleaned_command == "mysql orm --host localhost --user root --password ***" + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py index 759f64bb..98adb5d7 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py @@ -5,18 +5,24 @@ class TestEagerRelation(unittest.TestCase): def test_can_register_string_eager_load(self): - self.assertEqual(EagerRelations().register("profile").get_eagers(), [["profile"]]) + self.assertEqual( + EagerRelations().register("profile").get_eagers(), [["profile"]] + ) self.assertEqual(EagerRelations().register("profile").is_nested, False) self.assertEqual( EagerRelations().register("profile.user").get_eagers(), [{"profile": ["user"]}], ) self.assertEqual( - EagerRelations().register("profile.user", "profile.logo").get_eagers(), + EagerRelations() + .register("profile.user", "profile.logo") + .get_eagers(), [{"profile": ["user", "logo"]}], ) self.assertEqual( - EagerRelations().register("profile.user", "profile.logo", "profile.bio").get_eagers(), + EagerRelations() + .register("profile.user", "profile.logo", "profile.bio") + .get_eagers(), [{"profile": ["user", "logo", "bio"]}], ) self.assertEqual( @@ -25,24 +31,32 @@ def test_can_register_string_eager_load(self): ) def test_can_register_tuple_eager_load(self): - self.assertEqual(EagerRelations().register(("profile",)).get_eagers(), [["profile"]]) + self.assertEqual( + EagerRelations().register(("profile",)).get_eagers(), [["profile"]] + ) self.assertEqual( EagerRelations().register(("profile", "user")).get_eagers(), [["profile", "user"]], ) self.assertEqual( - EagerRelations().register(("profile.name", "profile.user")).get_eagers(), + EagerRelations() + .register(("profile.name", "profile.user")) + .get_eagers(), [{"profile": ["name", "user"]}], ) def test_can_register_list_eager_load(self): - self.assertEqual(EagerRelations().register(["profile"]).get_eagers(), [["profile"]]) + self.assertEqual( + EagerRelations().register(["profile"]).get_eagers(), [["profile"]] + ) self.assertEqual( EagerRelations().register(["profile", "user"]).get_eagers(), [["profile", "user"]], ) self.assertEqual( - EagerRelations().register(["profile.name", "profile.user"]).get_eagers(), + EagerRelations() + .register(["profile.name", "profile.user"]) + .get_eagers(), [{"profile": ["name", "user"]}], ) self.assertEqual( @@ -54,6 +68,8 @@ def test_can_register_list_eager_load(self): [["logo"], {"profile": ["name"]}], ) self.assertEqual( - EagerRelations().register(["profile.name", "logo", "profile.user"]).get_eagers(), + EagerRelations() + .register(["profile.name", "logo", "profile.user"]) + .get_eagers(), [["logo"], {"profile": ["name", "user"]}], ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py index 868264b0..63ff77f5 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py @@ -36,7 +36,9 @@ def test_can_make_single(self): self.assertIsInstance(user, User) def test_can_make_several(self): - users = factory(User).make([{"id": 1, "name": "Joe"}, {"id": 2, "name": "Bob"}]) + users = factory(User).make( + [{"id": 1, "name": "Joe"}, {"id": 2, "name": "Bob"}] + ) self.assertEqual(users.count(), 2) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py index 0fc3199b..d963cdae 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py @@ -7,6 +7,7 @@ from fastapi_startkit.masoniteorm.connections.factory import ConnectionFactory + load_dotenv(".env") diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py index 34de112a..00a0410e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py @@ -1,6 +1,5 @@ from fastapi_startkit.masoniteorm.migrations import Migration - class CreateUsersTable(Migration): async def up(self): """ diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py index f44c77f9..af3ebdd1 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py @@ -1,7 +1,9 @@ -from dataclasses import asdict, dataclass +from dataclasses import dataclass, asdict from enum import StrEnum +from fastapi_startkit.carbon import Carbon from fastapi_startkit.masoniteorm import Model +from fastapi_startkit.masoniteorm.models.fields import Field @dataclass @@ -12,31 +14,31 @@ class Address: def get(self, value): import json - if isinstance(value, str): value = json.loads(value) - return Address(city=value.get("city"), country=value.get("country"), street=value.get("street")) + return Address( + city=value.get("city"), + country=value.get("country"), + street=value.get("street") + ) def set(self, value): import json - if isinstance(value, Address): return json.dumps(asdict(value)) return json.dumps(value) - class Gender(StrEnum): MALE = "male" FEMALE = "female" OTHER = "other" - class User(Model): __primary_key__ = "id" __table__ = "users" __casts__ = { - "metadata": "json", + 'metadata': 'json', } id: int diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py index fc03b590..25ccb133 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py @@ -1,6 +1,5 @@ from fastapi_startkit.masoniteorm.testing import TestCase -from fastapi_startkit.masoniteorm.tests.integrations.model import Address, Gender, User - +from fastapi_startkit.masoniteorm.tests.integrations.model import User, Gender, Address class TestModelCast(TestCase): migration_directory = "src/fastapi_startkit/masoniteorm/tests/integrations/databases/migrations" @@ -37,7 +36,7 @@ async def test_can_insert_all_types(self): "bio": "A long text for bio...", "price": 19.99, "gender": Gender.MALE, - "address": {"city": "New York", "country": "USA", "street": "Broadway"}, + "address": {"city": "New York", "country": "USA", "street": "Broadway"} } await User.create(data) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py index a1e518f7..ee145129 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py @@ -50,7 +50,9 @@ class ModelWithBaseModel(BaseModel): class TestModels(unittest.TestCase): def test_model_can_access_str_dates_as_pendulum(self): - model = ModelTest.hydrate({"user": "joe", "due_date": "2020-11-28 11:42:07"}) + model = ModelTest.hydrate( + {"user": "joe", "due_date": "2020-11-28 11:42:07"} + ) self.assertTrue(model.user) self.assertTrue(model.due_date) @@ -61,14 +63,24 @@ def test_model_can_access_str_dates_as_pendulum_from_correct_datetimes( ): model = ModelTest() - self.assertEqual(model.get_new_date(datetime.datetime(2021, 1, 1, 7, 10)).hour, 7) + self.assertEqual( + model.get_new_date(datetime.datetime(2021, 1, 1, 7, 10)).hour, 7 + ) self.assertEqual(model.get_new_date(datetime.date(2021, 1, 1)).hour, 0) self.assertEqual(model.get_new_date(datetime.time(1, 1, 1)).hour, 1) self.assertEqual(model.get_new_date("2020-11-28 11:42:07").hour, 11) def test_model_can_access_str_dates_on_relationships(self): - model = ModelTest.hydrate({"user": "joe", "due_date": "2020-11-28 11:42:07"}) - model.add_relation({"profile": ModelTest.hydrate({"name": "bob", "due_date": "2020-11-28 11:42:07"})}) + model = ModelTest.hydrate( + {"user": "joe", "due_date": "2020-11-28 11:42:07"} + ) + model.add_relation( + { + "profile": ModelTest.hydrate( + {"name": "bob", "due_date": "2020-11-28 11:42:07"} + ) + } + ) self.assertEqual(model.profile.name, "bob") self.assertTrue(model.profile.due_date.is_past()) @@ -77,7 +89,9 @@ def test_model_original_and_dirty_attributes(self): model = ModelTest.hydrate({"username": "joe", "admin": True}) self.assertEqual(model.username, "joe") - self.assertEqual(model.__original_attributes__, {"username": "joe", "admin": True}) + self.assertEqual( + model.__original_attributes__, {"username": "joe", "admin": True} + ) model.username = "bob" @@ -87,7 +101,9 @@ def test_model_original_and_dirty_attributes(self): self.assertEqual(model.__dirty_attributes__["username"], "bob") self.assertEqual(model.get_dirty_keys(), ["username"]) self.assertTrue(model.is_dirty() is True) - self.assertEqual(model.__original_attributes__, {"username": "joe", "admin": True}) + self.assertEqual( + model.__original_attributes__, {"username": "joe", "admin": True} + ) def test_model_creates_when_new(self): model = ModelTest.hydrate({"id": 1, "username": "joe", "admin": True}) @@ -161,15 +177,21 @@ def test_model_can_cast_dict_attributes(self): self.assertEqual(type(model.d), Decimal) def test_valid_json_cast(self): - model = ModelTest.hydrate({"payload": {"this": "dict", "is": "usable", "as": "json"}}) + model = ModelTest.hydrate( + {"payload": {"this": "dict", "is": "usable", "as": "json"}} + ) self.assertEqual(type(model.payload), dict) - model = ModelTest.hydrate({"payload": {"this": "dict", "is": "invalid", "as": "json"}}) + model = ModelTest.hydrate( + {"payload": {"this": "dict", "is": "invalid", "as": "json"}} + ) self.assertEqual(type(model.payload), dict) - model = ModelTest.hydrate({"payload": '{"this": "dict", "is": "usable", "as": "json"}'}) + model = ModelTest.hydrate( + {"payload": '{"this": "dict", "is": "usable", "as": "json"}'} + ) self.assertEqual(type(model.payload), dict) @@ -177,7 +199,9 @@ def test_valid_json_cast(self): self.assertEqual(type(model.payload), dict) - model = ModelTest.hydrate({"payload": "{'this': 'should', 'throw': 'error'}"}) + model = ModelTest.hydrate( + {"payload": "{'this': 'should', 'throw': 'error'}"} + ) self.assertEqual(model.payload, None) @@ -186,7 +210,9 @@ def test_valid_json_cast(self): model.save() def test_model_update_without_changes(self): - model = ModelTest.hydrate({"id": 1, "username": "joe", "name": "Joe", "admin": True}) + model = ModelTest.hydrate( + {"id": 1, "username": "joe", "name": "Joe", "admin": True} + ) model.username = "joe" model.name = "Bill" @@ -195,7 +221,9 @@ def test_model_update_without_changes(self): self.assertNotIn("username", sql) def test_force_update_on_model_class(self): - model = ModelTestForced.hydrate({"id": 1, "username": "joe", "name": "Joe", "admin": True}) + model = ModelTestForced.hydrate( + {"id": 1, "username": "joe", "name": "Joe", "admin": True} + ) model.username = "joe" model.name = "Bill" @@ -205,13 +233,17 @@ def test_force_update_on_model_class(self): self.assertIn("name", sql) def test_only_method(self): - model = ModelTestForced.hydrate({"id": 1, "username": "joe", "name": "Joe", "admin": True}) + model = ModelTestForced.hydrate( + {"id": 1, "username": "joe", "name": "Joe", "admin": True} + ) self.assertEqual({"username": "joe"}, model.only("username")) self.assertEqual({"username": "joe"}, model.only(["username"])) def test_model_update_without_changes_at_all(self): - model = ModelTest.hydrate({"id": 1, "username": "joe", "name": "Joe", "admin": True}) + model = ModelTest.hydrate( + {"id": 1, "username": "joe", "name": "Joe", "admin": True} + ) model.username = "joe" model.name = "Joe" @@ -232,7 +264,11 @@ def test_model_using_or_where_and_chaining_wheres(self): sql = ( model.where("name", "=", "joe") - .or_where(lambda query: query.where("username", "Joseph").or_where("age", ">=", 18)) + .or_where( + lambda query: query.where("username", "Joseph").or_where( + "age", ">=", 18 + ) + ) .to_sql() ) @@ -272,7 +308,9 @@ def test_model_can_provide_default_select(self): ) def test_model_can_override_to_default_select(self): - sql = ModelWithBaseModel.select(["products.name", "products.id", "store.name"]).to_sql() + sql = ModelWithBaseModel.select( + ["products.name", "products.id", "store.name"] + ).to_sql() self.assertEqual( sql, """SELECT `products`.`name`, `products`.`id`, `store`.`name` FROM `users`""", diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py index bdc51648..ea8cb484 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py @@ -38,7 +38,9 @@ def test_sum(self): builder = self.get_builder() builder.sum("age") - self.assertEqual(builder.to_sql(), "SELECT SUM([users].[age]) AS age FROM [users]") + self.assertEqual( + builder.to_sql(), "SELECT SUM([users].[age]) AS age FROM [users]" + ) def test_where_like(self): builder = self.get_builder() @@ -62,19 +64,25 @@ def test_max(self): builder = self.get_builder() builder.max("age") - self.assertEqual(builder.to_sql(), "SELECT MAX([users].[age]) AS age FROM [users]") + self.assertEqual( + builder.to_sql(), "SELECT MAX([users].[age]) AS age FROM [users]" + ) def test_min(self): builder = self.get_builder() builder.min("age") - self.assertEqual(builder.to_sql(), "SELECT MIN([users].[age]) AS age FROM [users]") + self.assertEqual( + builder.to_sql(), "SELECT MIN([users].[age]) AS age FROM [users]" + ) def test_avg(self): builder = self.get_builder() builder.avg("age") - self.assertEqual(builder.to_sql(), "SELECT AVG([users].[age]) AS age FROM [users]") + self.assertEqual( + builder.to_sql(), "SELECT AVG([users].[age]) AS age FROM [users]" + ) def test_all(self): builder = self.get_builder() @@ -107,7 +115,9 @@ def test_add_select_no_table(self): builder.add_select( "other_test", lambda q: q.max("updated_at").table("different_table"), - ).add_select("some_alias", lambda q: q.max("updated_at").table("another_table")) + ).add_select( + "some_alias", lambda q: q.max("updated_at").table("another_table") + ) self.assertEqual( builder.to_sql(), @@ -122,7 +132,9 @@ def test_select_raw(self): builder = self.get_builder() builder.select_raw("count(email) as email_count") - self.assertEqual(builder.to_sql(), "SELECT count(email) as email_count FROM [users]") + self.assertEqual( + builder.to_sql(), "SELECT count(email) as email_count FROM [users]" + ) def test_create(self): builder = self.get_builder().without_global_scopes() @@ -156,7 +168,9 @@ def test_where(self): def test_where_exists(self): builder = self.get_builder() builder.where_exists("name") - self.assertEqual(builder.to_sql(), "SELECT * FROM [users] WHERE EXISTS 'name'") + self.assertEqual( + builder.to_sql(), "SELECT * FROM [users] WHERE EXISTS 'name'" + ) def test_limit(self): builder = self.get_builder() @@ -199,7 +213,9 @@ def test_right_join(self): ) def test_update(self): - builder = self.get_builder().update({"name": "Joe", "email": "joe@yopmail.com"}, dry=True) + builder = self.get_builder().update( + {"name": "Joe", "email": "joe@yopmail.com"}, dry=True + ) self.assertEqual( builder.to_sql(), "UPDATE [users] SET [users].[name] = 'Joe', [users].[email] = 'joe@yopmail.com'", @@ -222,17 +238,23 @@ def test_update(self): def test_count(self): builder = self.get_builder() builder.count("id") - self.assertEqual(builder.to_sql(), "SELECT COUNT([users].[id]) AS id FROM [users]") + self.assertEqual( + builder.to_sql(), "SELECT COUNT([users].[id]) AS id FROM [users]" + ) def test_order_by_asc(self): builder = self.get_builder() builder.order_by("email", "asc") - self.assertEqual(builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] ASC") + self.assertEqual( + builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] ASC" + ) def test_order_by_desc(self): builder = self.get_builder() builder.order_by("email", "desc") - self.assertEqual(builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] DESC") + self.assertEqual( + builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] DESC" + ) def test_where_column(self): builder = self.get_builder() @@ -295,7 +317,9 @@ def test_where_not_null(self): def test_having(self): builder = self.get_builder(table="payments") - builder.select("user_id").avg("salary").group_by("user_id").having("salary", ">=", "1000") + builder.select("user_id").avg("salary").group_by("user_id").having( + "salary", ">=", "1000" + ) self.assertEqual( builder.to_sql(), @@ -382,7 +406,12 @@ def test_or_where(self): def test_can_call_with_schema(self): builder = self.get_builder() - sql = builder.table("information_schema.columns").select("table_name").where("table_name", "users").to_sql() + sql = ( + builder.table("information_schema.columns") + .select("table_name") + .where("table_name", "users") + .to_sql() + ) self.assertEqual( sql, """SELECT [information_schema].[columns].[table_name] FROM [information_schema].[columns] WHERE [information_schema].[columns].[table_name] = 'users'""", @@ -401,7 +430,9 @@ def test_truncate_without_foreign_keys(self): def test_latest(self): builder = self.get_builder() builder.latest("email") - self.assertEqual(builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] DESC") + self.assertEqual( + builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] DESC" + ) def test_latest_multiple(self): builder = self.get_builder() @@ -414,7 +445,9 @@ def test_latest_multiple(self): def test_oldest(self): builder = self.get_builder() builder.oldest("email") - self.assertEqual(builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] ASC") + self.assertEqual( + builder.to_sql(), "SELECT * FROM [users] ORDER BY [email] ASC" + ) def test_oldest_multiple(self): builder = self.get_builder() diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py index 42c3d82f..ff070d40 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py @@ -1,6 +1,7 @@ import unittest from dotenv import load_dotenv + from src.masoniteorm.models import Model from src.masoniteorm.query import QueryBuilder from src.masoniteorm.query.grammars import MSSQLGrammar @@ -91,7 +92,9 @@ def test_has_reference_to_self_using_class(self): def test_where_has_query(self): builder = self.get_builder() - sql = builder.where_has("articles", lambda q: q.where("active", 1)).to_sql() + sql = builder.where_has( + "articles", lambda q: q.where("active", 1) + ).to_sql() self.assertEqual( sql, """SELECT * FROM [users] WHERE EXISTS (""" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py index 07a44114..1e5007a0 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py @@ -15,7 +15,15 @@ def test_can_compile_delete(self): self.assertEqual(to_sql, sql) def test_can_compile_delete_with_where(self): - to_sql = self.builder.where("age", 20).where("profile", 1).set_action("delete").delete(query=True).to_sql() + to_sql = ( + self.builder.where("age", 20) + .where("profile", 1) + .set_action("delete") + .delete(query=True) + .to_sql() + ) - sql = "DELETE FROM [users] WHERE [users].[age] = '20' AND [users].[profile] = '1'" + sql = ( + "DELETE FROM [users] WHERE [users].[age] = '20' AND [users].[profile] = '1'" + ) self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py index ca69af6c..8980db78 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py @@ -29,7 +29,9 @@ def test_can_compile_bulk_create(self): self.assertEqual(to_sql, sql) def test_can_compile_bulk_create_qmark(self): - to_sql = self.builder.bulk_create([{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True).to_qmark() + to_sql = self.builder.bulk_create( + [{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True + ).to_qmark() sql = "INSERT INTO [users] ([name]) VALUES (?), (?), (?)" self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py index 7860c318..a0595df8 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py @@ -117,7 +117,9 @@ def can_compile_where_raw(self): return "SELECT * FROM [users] WHERE [users].[age] = '18'" def test_can_compile_where_raw_and_where_with_multiple_bindings(self): - query = self.builder.where_raw("[age] = ? AND [is_admin] = ?", [18, True]).where("email", "test@example.com") + query = self.builder.where_raw( + "[age] = ? AND [is_admin] = ?", [18, True] + ).where("email", "test@example.com") self.assertEqual( query.to_qmark(), "SELECT * FROM [users] WHERE [age] = ? AND [is_admin] = ? AND [users].[email] = ?", @@ -173,7 +175,9 @@ def can_compile_or_where(self): """ self.builder.where('name', 2).or_where('name', 3).to_sql() """ - return "SELECT * FROM [users] WHERE [users].[name] = '2' OR [users].[name] = '3'" + return ( + "SELECT * FROM [users] WHERE [users].[name] = '2' OR [users].[name] = '3'" + ) def can_grouped_where(self): """ @@ -300,12 +304,21 @@ def test_can_compile_where_raw(self): self.assertEqual(to_sql, "SELECT * FROM [users] WHERE [age] = '18'") def test_can_compile_having_raw(self): - to_sql = self.builder.select_raw("COUNT(*) as counts").having_raw("counts > 10").to_sql() - self.assertEqual(to_sql, "SELECT COUNT(*) as counts FROM [users] HAVING counts > 10") + to_sql = ( + self.builder.select_raw("COUNT(*) as counts") + .having_raw("counts > 10") + .to_sql() + ) + self.assertEqual( + to_sql, "SELECT COUNT(*) as counts FROM [users] HAVING counts > 10" + ) def test_can_compile_having_raw_order(self): to_sql = ( - self.builder.select_raw("COUNT(*) as counts").having_raw("counts > 10").order_by_raw("counts DESC").to_sql() + self.builder.select_raw("COUNT(*) as counts") + .having_raw("counts > 10") + .order_by_raw("counts DESC") + .to_sql() ) self.assertEqual( to_sql, @@ -314,12 +327,16 @@ def test_can_compile_having_raw_order(self): def test_can_compile_select_raw(self): to_sql = self.builder.select_raw("COUNT(*)").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_select_raw_with_select(self): to_sql = self.builder.select("id").select_raw("COUNT(*)").to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def can_compile_first_or_fail(self): @@ -380,9 +397,7 @@ def can_compile_join_clause_with_value(self): ) builder.join(clause).to_sql() """ - return ( - "SELECT * FROM [users] INNER JOIN [report_groups] AS [rg] ON [bgt].[active] = '1' OR [bgt].[acct] = '1234'" - ) + return "SELECT * FROM [users] INNER JOIN [report_groups] AS [rg] ON [bgt].[active] = '1' OR [bgt].[acct] = '1234'" def can_compile_join_clause_with_null(self): """ @@ -421,9 +436,7 @@ def can_compile_join_clause_with_lambda(self): ), ).to_sql() """ - return ( - "SELECT * FROM [users] INNER JOIN [report_groups] AS [rg] ON [bgt].[fund] = [rg].[fund] AND [bgt] IS NULL" - ) + return "SELECT * FROM [users] INNER JOIN [report_groups] AS [rg] ON [bgt].[fund] = [rg].[fund] AND [bgt] IS NULL" def can_compile_left_join_clause_with_lambda(self): """ @@ -478,7 +491,9 @@ def where_not_exists_with_lambda(self): return """SELECT * FROM [users] WHERE NOT EXISTS (SELECT * FROM [users] WHERE [users].[age] = '1')""" def where_date(self): - return """SELECT * FROM [users] WHERE DATE([users].[created_at]) = '2022-06-01'""" + return ( + """SELECT * FROM [users] WHERE DATE([users].[created_at]) = '2022-06-01'""" + ) def or_where_null(self): return """SELECT * FROM [users] WHERE [users].[column1] IS NULL OR [users].[column2] IS NULL""" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py index aec241b1..49c6e4ab 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py @@ -1,8 +1,8 @@ import unittest -from src.masoniteorm.expressions import Raw from src.masoniteorm.query import QueryBuilder from src.masoniteorm.query.grammars import MSSQLGrammar +from src.masoniteorm.expressions import Raw class TestMSSQLUpdateGrammar(unittest.TestCase): @@ -10,13 +10,20 @@ def setUp(self): self.builder = QueryBuilder(MSSQLGrammar, table="users") def test_can_compile_update(self): - to_sql = self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + to_sql = ( + self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + ) sql = "UPDATE [users] SET [users].[name] = 'Joe' WHERE [users].[name] = 'bob'" self.assertEqual(to_sql, sql) def test_can_compile_update_with_multiple_where(self): - to_sql = self.builder.where("name", "bob").where("age", 20).update({"name": "Joe"}, dry=True).to_sql() + to_sql = ( + self.builder.where("name", "bob") + .where("age", 20) + .update({"name": "Joe"}, dry=True) + .to_sql() + ) sql = "UPDATE [users] SET [users].[name] = 'Joe' WHERE [users].[name] = 'bob' AND [users].[age] = '20'" self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py index b92b8be6..4205bc7e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py @@ -1,9 +1,9 @@ import unittest +from tests.integrations.config.database import DATABASES from src.masoniteorm.connections import MSSQLConnection from src.masoniteorm.schema import Schema from src.masoniteorm.schema.platforms import MSSQLPlatform -from tests.integrations.config.database import DATABASES class TestMSSQLSchemaBuilder(unittest.TestCase): @@ -169,7 +169,9 @@ def test_can_advanced_table_creation2(self): blueprint.string("thumbnail").nullable() blueprint.integer("premium") blueprint.integer("author_id").unsigned().nullable() - blueprint.foreign("author_id").references("id").on("users").on_delete("CASCADE") + blueprint.foreign("author_id").references("id").on("users").on_delete( + "CASCADE" + ) blueprint.text("description") blueprint.timestamps() @@ -190,7 +192,9 @@ def test_can_advanced_table_creation2(self): def test_can_add_columns_with_foreign_key_constraint_name(self): with self.schema.create("users") as blueprint: blueprint.integer("profile_id") - blueprint.foreign("profile_id", name="profile_foreign").references("id").on("profiles") + blueprint.foreign("profile_id", name="profile_foreign").references("id").on( + "profiles" + ) self.assertEqual(len(blueprint.table.added_columns), 1) self.assertEqual( diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py index de587748..f1b323e2 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py @@ -1,10 +1,10 @@ import unittest +from tests.integrations.config.database import DATABASES from src.masoniteorm.connections import MSSQLConnection from src.masoniteorm.schema import Schema from src.masoniteorm.schema.platforms import MSSQLPlatform from src.masoniteorm.schema.Table import Table -from tests.integrations.config.database import DATABASES class TestMySQLSchemaBuilderAlter(unittest.TestCase): @@ -26,7 +26,9 @@ def test_can_add_columns(self): self.assertEqual(len(blueprint.table.added_columns), 2) - sql = ["ALTER TABLE [users] ADD [name] VARCHAR(255) NOT NULL, [age] INT NOT NULL"] + sql = [ + "ALTER TABLE [users] ADD [name] VARCHAR(255) NOT NULL, [age] INT NOT NULL" + ] self.assertEqual(blueprint.to_sql(), sql) @@ -79,7 +81,9 @@ def test_alter_drop1(self): def test_alter_add_column_and_foreign_key(self): with self.schema.table("users") as blueprint: blueprint.unsigned_integer("playlist_id").nullable() - blueprint.foreign("playlist_id").references("id").on("playlists").on_delete("cascade") + blueprint.foreign("playlist_id").references("id").on("playlists").on_delete( + "cascade" + ) sql = [ "ALTER TABLE [users] ADD [playlist_id] INT NULL", @@ -128,7 +132,9 @@ def test_alter_add_primary(self): with self.schema.table("users") as blueprint: blueprint.primary("playlist_id") - sql = ["ALTER TABLE [users] ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)"] + sql = [ + "ALTER TABLE [users] ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)" + ] self.assertEqual(blueprint.to_sql(), sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py index 67f3de9a..9ee7950a 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py @@ -18,7 +18,9 @@ class BaseTestQueryRelationships(unittest.TestCase): def get_builder(self, table="users"): connection = ConnectionFactory().make("mysql") - return QueryBuilder(grammar=MySQLGrammar, connection=connection, table=table).on("mysql") + return QueryBuilder( + grammar=MySQLGrammar, connection=connection, table=table + ).on("mysql") def test_transaction(self): builder = self.get_builder() diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py index b274311b..85252f6a 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py @@ -41,72 +41,94 @@ def test_sum(self): builder = self.get_builder() builder.sum("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_sum_chained(self): builder = self.get_builder() builder.sum("age").max("salary") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_with_(self): builder = self.get_builder() builder.with_("articles").sum("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_like(self): builder = self.get_builder() builder.where("age", "like", "%name%") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_like(self): builder = self.get_builder() builder.where("age", "not like", "%name%") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_max(self): builder = self.get_builder() builder.max("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_min(self): builder = self.get_builder() builder.min("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_avg(self): builder = self.get_builder() builder.avg("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_all(self): builder = self.get_builder() builder.all() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_get(self): builder = self.get_builder() builder.get() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_first(self): builder = self.get_builder().first(query=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_find_with_model(self): @@ -138,7 +160,9 @@ def test_find_with_builder_and_list(self): builder = self.get_builder() builder._model = None builder.find([10, 20, 30], column="age", query=True) - sql = """SELECT * FROM `users` WHERE `users`.`age` IN ('10','20','30')""" + sql = ( + """SELECT * FROM `users` WHERE `users`.`age` IN ('10','20','30')""" + ) self.assertEqual(builder.to_sql(), sql) def test_find_with_builder_without_column(self): @@ -150,31 +174,41 @@ def test_find_with_builder_without_column(self): def test_select(self): builder = self.get_builder() builder.select("name", "email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_with_table(self): builder = self.get_builder() builder.select("users.*") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_with_table_raw(self): builder = self.get_builder() builder.select("users.*").from_raw("orders, customers") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_with_alias(self): builder = self.get_builder() builder.select("users.username as name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_raw(self): builder = self.get_builder() builder.select_raw("count(email) as email_count") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_add_select(self): @@ -185,7 +219,9 @@ def test_add_select(self): .add_select("salary", lambda q: q.count("*").table("salary")) .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_add_select_no_table(self): @@ -201,7 +237,9 @@ def test_add_select_no_table(self): ) .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_create(self): @@ -210,60 +248,82 @@ def test_create(self): {"name": "Corentin All", "email": "corentin@yopmail.com"}, query=True, ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_delete(self): builder = self.get_builder() builder.delete("name", "Joe", query=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where(self): builder = self.get_builder() builder.where("name", "Joe") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_exists(self): builder = self.get_builder() builder.where_exists("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_limit(self): builder = self.get_builder() builder.limit(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_offset(self): builder = self.get_builder() builder.offset(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_join(self): builder = self.get_builder() builder.join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_left_join(self): builder = self.get_builder() builder.left_join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_right_join(self): builder = self.get_builder() builder.right_join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_update(self): - builder = self.get_builder().update({"name": "Joe", "email": "joe@yopmail.com"}, dry=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + builder = self.get_builder().update( + {"name": "Joe", "email": "joe@yopmail.com"}, dry=True + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) # def test_increment(self): @@ -285,78 +345,104 @@ def test_update(self): def test_count(self): builder = self.get_builder() builder.count("id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_asc(self): builder = self.get_builder() builder.order_by("email", "asc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_desc(self): builder = self.get_builder() builder.order_by("email", "desc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_column(self): builder = self.get_builder() builder.where_column("name", "username") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_in(self): builder = self.get_builder() builder.where_not_in("id", [1, 2, 3]) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_between(self): builder = self.get_builder() builder.between("id", 2, 5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_not_between(self): builder = self.get_builder() builder.not_between("id", 2, 5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_in(self): builder = self.get_builder() builder.where_in("id", [1, 2, 3]) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_null(self): builder = self.get_builder() builder.where_null("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_null(self): builder = self.get_builder() builder.where_not_null("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_having(self): builder = self.get_builder(table="payments") - builder.select("user_id").avg("salary").group_by("user_id").having("salary", ">=", "1000") + builder.select("user_id").avg("salary").group_by("user_id").having( + "salary", ">=", "1000" + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_group_by(self): builder = self.get_builder(table="payments") builder.select("user_id").min("salary").group_by("user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_builder_alone(self): @@ -383,43 +469,57 @@ def test_builder_alone(self): def test_where_lt(self): builder = self.get_builder() builder.where("age", "<", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_lte(self): builder = self.get_builder() builder.where("age", "<=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_gt(self): builder = self.get_builder() builder.where("age", ">", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_gte(self): builder = self.get_builder() builder.where("age", ">=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_ne(self): builder = self.get_builder() builder.where("age", "!=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_or_where(self): builder = self.get_builder() builder.where("age", "20").or_where("age", "<", 20) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_or_where(self): builder = self.get_builder() builder.where("age", "20").or_where("age", "<", 20) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_like_as_operator(self): @@ -448,7 +548,12 @@ def test_where_not_like(self): def test_can_call_with_multi_tables(self): builder = self.get_builder() - sql = builder.table("information_schema.columns").select("table_name").where("table_name", "users").to_sql() + sql = ( + builder.table("information_schema.columns") + .select("table_name") + .where("table_name", "users") + .to_sql() + ) self.assertEqual( sql, """SELECT `information_schema`.`columns`.`table_name` FROM `information_schema`.`columns` WHERE `information_schema`.`columns`.`table_name` = 'users'""", @@ -457,25 +562,33 @@ def test_can_call_with_multi_tables(self): def test_truncate(self): builder = self.get_builder(dry=True) sql = builder.truncate() - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_truncate_without_foreign_keys(self): builder = self.get_builder(dry=True) sql = builder.truncate(foreign_keys=True) - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_shared_lock(self): builder = self.get_builder(dry=True) sql = builder.where("votes", ">=", 100).shared_lock().to_sql() - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_update_lock(self): builder = self.get_builder(dry=True) sql = builder.where("votes", ">=", 100).lock_for_update().to_sql() - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) @@ -698,7 +811,9 @@ def where_column(self): """ builder.where_column('name', 'username') """ - return "SELECT * FROM `users` WHERE `users`.`name` = `users`.`username`" + return ( + "SELECT * FROM `users` WHERE `users`.`name` = `users`.`username`" + ) def where_null(self): """ @@ -734,7 +849,9 @@ def not_between(self): """ builder.not_between('id', 2, 5) """ - return "SELECT * FROM `users` WHERE `users`.`id` NOT BETWEEN '2' AND '5'" + return ( + "SELECT * FROM `users` WHERE `users`.`id` NOT BETWEEN '2' AND '5'" + ) def having(self): """ @@ -834,18 +951,24 @@ def update_lock(self): builder = self.get_builder() builder.truncate() """ - return "SELECT * FROM `users` WHERE `users`.`votes` >= '100' FOR UPDATE" + return ( + "SELECT * FROM `users` WHERE `users`.`votes` >= '100' FOR UPDATE" + ) def test_latest(self): builder = self.get_builder() builder.latest("email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_oldest(self): builder = self.get_builder() builder.oldest("email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def latest(self): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py index bba513a3..100cc6a3 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py @@ -21,7 +21,9 @@ def get_builder(self, table="users"): ) def test_scopes(self): - builder = self.get_builder().set_scope("gender", lambda model, q: q.where("gender", "w")) + builder = self.get_builder().set_scope( + "gender", lambda model, q: q.where("gender", "w") + ) self.assertEqual( builder.gender().where("id", 1).to_sql(), @@ -49,7 +51,11 @@ def test_global_scope_from_class(self): ) def test_global_scope_remove_from_class(self): - builder = self.get_builder().set_global_scope(SoftDeleteScope()).remove_global_scope(SoftDeleteScope()) + builder = ( + self.get_builder() + .set_global_scope(SoftDeleteScope()) + .remove_global_scope(SoftDeleteScope()) + ) self.assertEqual( builder.where("id", 1).to_sql(), @@ -59,4 +65,6 @@ def test_global_scope_remove_from_class(self): def test_global_scope_adds_method(self): builder = self.get_builder().set_global_scope(SoftDeleteScope()) - self.assertEqual(builder.with_trashed().to_sql(), "SELECT * FROM `users`") + self.assertEqual( + builder.with_trashed().to_sql(), "SELECT * FROM `users`" + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py index 93a73a94..c17acee7 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py @@ -12,19 +12,31 @@ def setUp(self): def test_can_compile_delete(self): to_sql = self.builder.delete("id", 1, query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_delete_in(self): to_sql = self.builder.delete("id", [1, 2, 3], query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_delete_with_where(self): - to_sql = self.builder.where("age", 20).where("profile", 1).set_action("delete").delete(query=True).to_sql() + to_sql = ( + self.builder.where("age", 20) + .where("profile", 1) + .set_action("delete") + .delete(query=True) + .to_sql() + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) @@ -62,4 +74,6 @@ def can_compile_delete_with_where(self): .to_sql() ) """ - return "DELETE FROM `users` WHERE `users`.`age` = '20' AND `users`.`profile` = '1'" + return ( + "DELETE FROM `users` WHERE `users`.`age` = '20' AND `users`.`profile` = '1'" + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py index 7d3e727b..0089ba2c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py @@ -12,13 +12,17 @@ def setUp(self): def test_can_compile_insert(self): to_sql = self.builder.create({"name": "Joe"}, query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_insert_with_keywords(self): to_sql = self.builder.create(name="Joe", query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create(self): @@ -32,13 +36,19 @@ def test_can_compile_bulk_create(self): query=True, ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create_qmark(self): - to_sql = self.builder.bulk_create([{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True).to_qmark() + to_sql = self.builder.bulk_create( + [{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True + ).to_qmark() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create_multiple(self): @@ -51,7 +61,9 @@ def test_can_compile_bulk_create_multiple(self): query=True, ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py index 532a22cf..f276101d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py @@ -12,78 +12,104 @@ def setUp(self): def test_can_compile_select(self): mark = self.builder.select("username").where("name", "Joe") - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_delete(self): mark = self.builder.where("name", "Joe").delete(query=True) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_update(self): mark = self.builder.update({"name": "Bob"}, dry=True).where("name", "Joe") - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_where_in(self): mark = self.builder.where_in("id", [1, 2, 3]) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_where_not_null(self): mark = self.builder.where_not_null("id") - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, []) def test_can_compile_where_with_falsy_values(self): mark = self.builder.where("name", 0) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_where_with_true_value(self): mark = self.builder.where("is_admin", True) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_where_with_false_value(self): mark = self.builder.where("is_admin", False) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_compile_sub_group_bindings(self): mark = self.builder.where( - lambda query: query.where("challenger", 1).or_where("proposer", 1).or_where("referee", 1) + lambda query: ( + query.where("challenger", 1) + .or_where("proposer", 1) + .or_where("referee", 1) + ) ) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(mark.to_qmark(), sql) self.assertEqual(mark._bindings, bindings) def test_can_increment(self): builder = self.builder.increment("age", dry=True) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_qmark(), sql) self.assertEqual(builder._bindings, bindings) def test_can_decrement(self): builder = self.builder.decrement("age", dry=True) - sql, bindings = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql, bindings = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_qmark(), sql) self.assertEqual(builder._bindings, bindings) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py index 0d6ccb2c..aa4d6b40 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py @@ -59,13 +59,17 @@ def can_compile_with_max_and_columns(self): """ self.builder.select('username').max('age').to_sql() """ - return "SELECT `users`.`username`, MAX(`users`.`age`) AS age FROM `users`" + return ( + "SELECT `users`.`username`, MAX(`users`.`age`) AS age FROM `users`" + ) def can_compile_with_max_and_columns_different_order(self): """ self.builder.max('age').select('username').to_sql() """ - return "SELECT `users`.`username`, MAX(`users`.`age`) AS age FROM `users`" + return ( + "SELECT `users`.`username`, MAX(`users`.`age`) AS age FROM `users`" + ) def can_compile_with_order_by(self): """ @@ -284,7 +288,9 @@ def can_compile_between(self): """ builder.between('age', 18, 21).to_sql() """ - return "SELECT * FROM `users` WHERE `users`.`age` BETWEEN '18' AND '21'" + return ( + "SELECT * FROM `users` WHERE `users`.`age` BETWEEN '18' AND '21'" + ) def can_compile_not_between(self): """ @@ -297,12 +303,21 @@ def test_can_compile_where_raw(self): self.assertEqual(to_sql, "SELECT * FROM `users` WHERE `age` = '18'") def test_can_compile_having_raw(self): - to_sql = self.builder.select_raw("COUNT(*) as counts").having_raw("counts > 10").to_sql() - self.assertEqual(to_sql, "SELECT COUNT(*) as counts FROM `users` HAVING counts > 10") + to_sql = ( + self.builder.select_raw("COUNT(*) as counts") + .having_raw("counts > 10") + .to_sql() + ) + self.assertEqual( + to_sql, "SELECT COUNT(*) as counts FROM `users` HAVING counts > 10" + ) def test_can_compile_having_raw_order(self): to_sql = ( - self.builder.select_raw("COUNT(*) as counts").having_raw("counts > 10").order_by_raw("counts DESC").to_sql() + self.builder.select_raw("COUNT(*) as counts") + .having_raw("counts > 10") + .order_by_raw("counts DESC") + .to_sql() ) self.assertEqual( to_sql, @@ -322,7 +337,9 @@ def can_compile_first_or_fail(self): builder = self.get_builder() builder.where("is_admin", "=", True).first_or_fail() """ - return """SELECT * FROM `users` WHERE `users`.`is_admin` = '1' LIMIT 1""" + return ( + """SELECT * FROM `users` WHERE `users`.`is_admin` = '1' LIMIT 1""" + ) def where_not_like(self): """ @@ -375,9 +392,7 @@ def can_compile_join_clause_with_value(self): ) builder.join(clause).to_sql() """ - return ( - "SELECT * FROM `users` INNER JOIN `report_groups` AS `rg` ON `bgt`.`active` = '1' OR `bgt`.`acct` = '1234'" - ) + return "SELECT * FROM `users` INNER JOIN `report_groups` AS `rg` ON `bgt`.`active` = '1' OR `bgt`.`acct` = '1234'" def can_compile_join_clause_with_null(self): """ @@ -416,9 +431,7 @@ def can_compile_join_clause_with_lambda(self): ), ).to_sql() """ - return ( - "SELECT * FROM `users` INNER JOIN `report_groups` AS `rg` ON `bgt`.`fund` = `rg`.`fund` AND `bgt` IS NULL" - ) + return "SELECT * FROM `users` INNER JOIN `report_groups` AS `rg` ON `bgt`.`fund` = `rg`.`fund` AND `bgt` IS NULL" def can_compile_left_join_clause_with_lambda(self): """ @@ -458,7 +471,9 @@ def update_lock(self): builder = self.get_builder() builder.where("age", "not like", "%name%").to_sql() """ - return "SELECT * FROM `users` WHERE `users`.`votes` >= '100' FOR UPDATE" + return ( + "SELECT * FROM `users` WHERE `users`.`votes` >= '100' FOR UPDATE" + ) def can_user_where_raw_and_where(self): """ diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py index fb0ba1c4..0212ec8f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py @@ -1,9 +1,9 @@ import inspect import unittest -from src.masoniteorm.expressions import Raw from src.masoniteorm.query import QueryBuilder from src.masoniteorm.query.grammars import MySQLGrammar +from src.masoniteorm.expressions import Raw class BaseTestCaseUpdateGrammar: @@ -11,21 +11,36 @@ def setUp(self): self.builder = QueryBuilder(self.grammar, table="users") def test_can_compile_update(self): - to_sql = self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + to_sql = ( + self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_multiple_update(self): - to_sql = self.builder.update({"name": "Joe", "email": "user@email.com"}, dry=True).to_sql() + to_sql = self.builder.update( + {"name": "Joe", "email": "user@email.com"}, dry=True + ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_update_with_multiple_where(self): - to_sql = self.builder.where("name", "bob").where("age", 20).update({"name": "Joe"}, dry=True).to_sql() - - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where("name", "bob") + .where("age", 20) + .update({"name": "Joe"}, dry=True) + .to_sql() + ) + + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) # def test_can_compile_increment(self): @@ -47,7 +62,9 @@ def test_can_compile_update_with_multiple_where(self): def test_raw_expression(self): to_sql = self.builder.update({"name": Raw("`username`")}, dry=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py index c18f25a7..93c90e2c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py @@ -22,13 +22,17 @@ def set_name_attribute(self, attribute): class TestAccessor(unittest.TestCase): def test_can_get_accessor(self): - user = User.hydrate({"name": "joe", "email": "joe@masoniteproject.com", "is_admin": 1}) + user = User.hydrate( + {"name": "joe", "email": "joe@masoniteproject.com", "is_admin": 1} + ) self.assertEqual(user.email, "joe@masoniteproject.com") self.assertEqual(user.name, "Hello, joe") self.assertTrue(user.is_admin is True, f"{user.is_admin} is not True") def test_mutator(self): - user = SetUser.hydrate({"email": "joe@masoniteproject.com", "is_admin": 1}) + user = SetUser.hydrate( + {"email": "joe@masoniteproject.com", "is_admin": 1} + ) user.name = "joe" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py index f1db3f48..152949df 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py @@ -4,6 +4,7 @@ import unittest import pendulum + from src.masoniteorm.collection import Collection from src.masoniteorm.exceptions import ModelNotFound from src.masoniteorm.models import Model @@ -78,12 +79,18 @@ class ProductNames(Model): class TestModel(unittest.TestCase): def test_create_can_use_fillable(self): - sql = ProfileFillable.create({"name": "Joe", "email": "user@example.com"}, query=True).to_sql() + sql = ProfileFillable.create( + {"name": "Joe", "email": "user@example.com"}, query=True + ).to_sql() - self.assertEqual(sql, "INSERT INTO `profiles` (`profiles`.`name`) VALUES ('Joe')") + self.assertEqual( + sql, "INSERT INTO `profiles` (`profiles`.`name`) VALUES ('Joe')" + ) def test_create_can_use_fillable_asterisk(self): - sql = ProfileFillAsterisk.create({"name": "Joe", "email": "user@example.com"}, query=True).to_sql() + sql = ProfileFillAsterisk.create( + {"name": "Joe", "email": "user@example.com"}, query=True + ).to_sql() self.assertEqual( sql, @@ -91,12 +98,18 @@ def test_create_can_use_fillable_asterisk(self): ) def test_create_can_use_guarded(self): - sql = ProfileGuarded.create({"name": "Joe", "email": "user@example.com"}, query=True).to_sql() + sql = ProfileGuarded.create( + {"name": "Joe", "email": "user@example.com"}, query=True + ).to_sql() - self.assertEqual(sql, "INSERT INTO `profiles` (`profiles`.`name`) VALUES ('Joe')") + self.assertEqual( + sql, "INSERT INTO `profiles` (`profiles`.`name`) VALUES ('Joe')" + ) def test_create_can_use_guarded_asterisk(self): - sql = ProfileGuardedAsterisk.create({"name": "Joe", "email": "user@example.com"}, query=True).to_sql() + sql = ProfileGuardedAsterisk.create( + {"name": "Joe", "email": "user@example.com"}, query=True + ).to_sql() # An asterisk guarded attribute excludes all fields from mass-assignment. # This would raise a DB error if there are any required fields. @@ -156,10 +169,14 @@ def test_bulk_create_can_use_guarded_asterisk(self): # An asterisk guarded attribute excludes all fields from mass-assignment. # This would obviously raise an invalid SQL syntax error. # TODO: Raise a clearer error? - self.assertEqual(query_builder.to_sql(), "INSERT INTO `profiles` () VALUES (), ()") + self.assertEqual( + query_builder.to_sql(), "INSERT INTO `profiles` () VALUES (), ()" + ) def test_update_can_use_fillable(self): - query_builder = ProfileFillable().update({"name": "Joe", "email": "user@example.com"}, dry=True) + query_builder = ProfileFillable().update( + {"name": "Joe", "email": "user@example.com"}, dry=True + ) self.assertEqual( query_builder.to_sql(), @@ -167,7 +184,9 @@ def test_update_can_use_fillable(self): ) def test_update_can_use_fillable_asterisk(self): - query_builder = ProfileFillAsterisk().update({"name": "Joe", "email": "user@example.com"}, dry=True) + query_builder = ProfileFillAsterisk().update( + {"name": "Joe", "email": "user@example.com"}, dry=True + ) self.assertEqual( query_builder.to_sql(), @@ -175,7 +194,9 @@ def test_update_can_use_fillable_asterisk(self): ) def test_update_can_use_guarded(self): - query_builder = ProfileGuarded().update({"name": "Joe", "email": "user@example.com"}, dry=True) + query_builder = ProfileGuarded().update( + {"name": "Joe", "email": "user@example.com"}, dry=True + ) self.assertEqual( query_builder.to_sql(), @@ -185,7 +206,9 @@ def test_update_can_use_guarded(self): def test_update_can_use_guarded_asterisk(self): profile = ProfileGuardedAsterisk() initial_sql = profile.get_builder().to_sql() - query_builder = profile.update({"name": "Joe", "email": "user@example.com"}, dry=True) + query_builder = profile.update( + {"name": "Joe", "email": "user@example.com"}, dry=True + ) # An asterisk guarded attribute excludes all fields from mass-assignment. # The query builder's sql should not have been altered in any way. @@ -212,7 +235,9 @@ def test_json(self): self.assertEqual(profile.to_json(), '{"name": "Joe", "id": 1}') def test_serialize_with_hidden(self): - profile = ProfileSerialize.hydrate({"name": "Joe", "id": 1, "password": "secret"}) + profile = ProfileSerialize.hydrate( + {"name": "Joe", "id": 1, "password": "secret"} + ) self.assertTrue(profile.serialize().get("name")) self.assertTrue(profile.serialize().get("id")) @@ -227,7 +252,9 @@ def test_serialize_with_visible(self): "email": "joe@masonite.com", } ) - self.assertTrue({"name": "Joe", "email": "joe@masonite.com"}, profile.serialize()) + self.assertTrue( + {"name": "Joe", "email": "joe@masonite.com"}, profile.serialize() + ) def test_serialize_with_visible_and_hidden_raise_error(self): profile = ProfileSerializeWithVisibleAndHidden.hydrate( @@ -279,7 +306,8 @@ def test_access_as_date(self): user = User.hydrate( { "name": "Joe", - "created_at": datetime.datetime.now() + datetime.timedelta(days=1), + "created_at": datetime.datetime.now() + + datetime.timedelta(days=1), } ) @@ -295,7 +323,9 @@ def test_serialize_with_dirty_attribute(self): profile = ProfileFillAsterisk.hydrate({"name": "Joe", "id": 1}) profile.age = 18 - self.assertEqual(profile.serialize(), {"age": 18, "name": "Joe", "id": 1}) + self.assertEqual( + profile.serialize(), {"age": 18, "name": "Joe", "id": 1} + ) def test_attribute_check_with_hasattr(self): self.assertFalse(hasattr(Profile(), "__password__")) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py index 2003f488..118f7cca 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py @@ -1,6 +1,7 @@ import unittest from dotenv import load_dotenv + from src.masoniteorm.models import Model from src.masoniteorm.relationships import ( belongs_to_many, @@ -46,7 +47,9 @@ class MySQLRelationships(unittest.TestCase): maxDiff = None def test_belongs_to_many(self): - sql = Permission.where_has("role", lambda query: query.where("slug", "users")).to_sql() + sql = Permission.where_has( + "role", lambda query: (query.where("slug", "users")) + ).to_sql() self.assertEqual( sql, @@ -71,7 +74,9 @@ def test_belongs_to_many_or_has(self): def test_belongs_to_many_or_where_has(self): sql = ( - Role.where("name", "role_name").or_where_has("permissions", lambda q: q.where("permission_id", 1)).to_sql() + Role.where("name", "role_name") + .or_where_has("permissions", lambda q: q.where("permission_id", 1)) + .to_sql() ) self.assertEqual( @@ -80,7 +85,11 @@ def test_belongs_to_many_or_where_has(self): ) def test_belongs_to_many_or_doesnt_have(self): - sql = Role.where("name", "role_name").or_doesnt_have("permissions").to_sql() + sql = ( + Role.where("name", "role_name") + .or_doesnt_have("permissions") + .to_sql() + ) self.assertEqual( sql, @@ -90,7 +99,9 @@ def test_belongs_to_many_or_doesnt_have(self): def test_where_doesnt_have(self): sql = ( Role.where("name", "role_name") - .where_doesnt_have("permissions", lambda q: q.where("name", "Creates Users")) + .where_doesnt_have( + "permissions", lambda q: q.where("name", "Creates Users") + ) .to_sql() ) @@ -102,7 +113,9 @@ def test_where_doesnt_have(self): def test_or_where_doesnt_have(self): sql = ( Role.where("name", "role_name") - .or_where_doesnt_have("permissions", lambda q: q.where("name", "Creates Users")) + .or_where_doesnt_have( + "permissions", lambda q: q.where("name", "Creates Users") + ) .to_sql() ) @@ -112,7 +125,9 @@ def test_or_where_doesnt_have(self): ) def test_belongs_to_many_where_has(self): - sql = Role.where_has("permissions", lambda q: q.where("name", "Creates Users")).to_sql() + sql = Role.where_has( + "permissions", lambda q: q.where("name", "Creates Users") + ).to_sql() self.assertEqual( sql, diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py index 332e8740..3c6d5b7e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py @@ -1,10 +1,10 @@ import unittest -from dotenv import load_dotenv from src.masoniteorm.models import Model from src.masoniteorm.relationships import ( has_many_through, ) +from dotenv import load_dotenv load_dotenv(".env") @@ -43,7 +43,9 @@ def test_or_has(self): ) def test_where_has_query(self): - sql = InboundShipment.where_has("from_country", lambda query: query.where("name", "USA")).to_sql() + sql = InboundShipment.where_has( + "from_country", lambda query: query.where("name", "USA") + ).to_sql() self.assertEqual( sql, @@ -73,7 +75,9 @@ def test_doesnt_have(self): def test_or_where_doesnt_have(self): sql = ( InboundShipment.where("name", "Joe") - .or_where_doesnt_have("from_country", lambda query: query.where("name", "USA")) + .or_where_doesnt_have( + "from_country", lambda query: query.where("name", "USA") + ) .to_sql() ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py index bc863060..4337dc83 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py @@ -1,10 +1,10 @@ import unittest -from dotenv import load_dotenv from src.masoniteorm.models import Model from src.masoniteorm.relationships import ( has_one_through, ) +from dotenv import load_dotenv load_dotenv(".env") @@ -43,7 +43,9 @@ def test_or_has(self): ) def test_where_has_query(self): - sql = InboundShipment.where_has("from_country", lambda query: query.where("name", "USA")).to_sql() + sql = InboundShipment.where_has( + "from_country", lambda query: query.where("name", "USA") + ).to_sql() self.assertEqual( sql, @@ -73,7 +75,9 @@ def test_doesnt_have(self): def test_or_where_doesnt_have(self): sql = ( InboundShipment.where("name", "Joe") - .or_where_doesnt_have("from_country", lambda query: query.where("name", "USA")) + .or_where_doesnt_have( + "from_country", lambda query: query.where("name", "USA") + ) .to_sql() ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py index 309d01fe..0829b439 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py @@ -1,6 +1,7 @@ import unittest from dotenv import load_dotenv + from src.masoniteorm.models import Model from src.masoniteorm.relationships import ( has_one, @@ -51,7 +52,9 @@ def test_or_has(self): ) def test_or_has_nested(self): - sql = User.where("name", "Joe").or_has("profile.identification").to_sql() + sql = ( + User.where("name", "Joe").or_has("profile.identification").to_sql() + ) self.assertEqual( sql, @@ -59,7 +62,11 @@ def test_or_has_nested(self): ) def test_relationship_where_has(self): - sql = User.where("name", "Joe").where_has("profile", lambda q: q.where("profile_id", 1)).to_sql() + sql = ( + User.where("name", "Joe") + .where_has("profile", lambda q: q.where("profile_id", 1)) + .to_sql() + ) self.assertEqual( sql, @@ -82,7 +89,11 @@ def test_relationship_where_has_nested(self): ) def test_relationship_or_where_has(self): - sql = User.where("name", "Joe").or_where_has("profile", lambda q: q.where("profile_id", 1)).to_sql() + sql = ( + User.where("name", "Joe") + .or_where_has("profile", lambda q: q.where("profile_id", 1)) + .to_sql() + ) self.assertEqual( sql, @@ -121,7 +132,9 @@ def test_relationship_doesnt_have_nested(self): ) def test_relationship_where_doesnt_have(self): - sql = User.where_doesnt_have("profile", lambda q: q.where("profile_id", 1)).to_sql() + sql = User.where_doesnt_have( + "profile", lambda q: q.where("profile_id", 1) + ).to_sql() self.assertEqual( sql, @@ -129,7 +142,9 @@ def test_relationship_where_doesnt_have(self): ) def test_relationship_where_doesnt_have_nested(self): - sql = User.where_doesnt_have("profile.identification", lambda q: q.where("identification_id", 1)).to_sql() + sql = User.where_doesnt_have( + "profile.identification", lambda q: q.where("identification_id", 1) + ).to_sql() self.assertEqual( sql, @@ -137,7 +152,9 @@ def test_relationship_where_doesnt_have_nested(self): ) def test_relationship_or_where_doesnt_have(self): - sql = User.or_where_doesnt_have("profile", lambda q: q.where("profile_id", 1)).to_sql() + sql = User.or_where_doesnt_have( + "profile", lambda q: q.where("profile_id", 1) + ).to_sql() self.assertEqual( sql, @@ -145,7 +162,9 @@ def test_relationship_or_where_doesnt_have(self): ) def test_relationship_or_where_doesnt_have_nested(self): - sql = User.or_where_doesnt_have("profile.identification", lambda q: q.where("identification_id", 1)).to_sql() + sql = User.or_where_doesnt_have( + "profile.identification", lambda q: q.where("identification_id", 1) + ).to_sql() self.assertEqual( sql, @@ -160,7 +179,9 @@ def test_joins(self): ) def test_join_on(self): - sql = User.join_on("profile", lambda q: q.where("active", 1)).to_sql() + sql = User.join_on( + "profile", lambda q: (q.where("active", 1)) + ).to_sql() self.assertEqual( sql, diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py index 15e12e84..b3aefc03 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py @@ -2,9 +2,11 @@ import unittest from src.masoniteorm import Model +from tests.integrations.config.database import DATABASES from src.masoniteorm.connections import MySQLConnection from src.masoniteorm.schema import Schema from src.masoniteorm.schema.platforms import MySQLPlatform + from tests.integrations.config.database import DATABASES @@ -32,7 +34,9 @@ def test_can_add_columns1(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE `users` (`name` VARCHAR(255) NOT NULL, `age` INT(11) NOT NULL)"], + [ + "CREATE TABLE `users` (`name` VARCHAR(255) NOT NULL, `age` INT(11) NOT NULL)" + ], ) def test_can_add_tiny_text(self): @@ -63,15 +67,17 @@ def test_can_create_table_if_not_exists(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE IF NOT EXISTS `users` (`name` VARCHAR(255) NOT NULL, `age` INT(11) NOT NULL)"], + [ + "CREATE TABLE IF NOT EXISTS `users` (`name` VARCHAR(255) NOT NULL, `age` INT(11) NOT NULL)" + ], ) def test_can_add_columns_with_constaint(self): with self.schema.create("users") as blueprint: blueprint.string("name") blueprint.integer("age") - (blueprint.unique("name"),) - (blueprint.unique("name", name="table_unique"),) + blueprint.unique("name"), + blueprint.unique("name", name="table_unique"), self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( @@ -88,7 +94,9 @@ def test_add_column_comment(self): self.assertEqual(len(blueprint.table.added_columns), 1) self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE `users` (`name` VARCHAR(255) NOT NULL COMMENT 'A users username')"], + [ + "CREATE TABLE `users` (`name` VARCHAR(255) NOT NULL COMMENT 'A users username')" + ], ) def test_can_add_table_comment(self): @@ -99,7 +107,9 @@ def test_can_add_table_comment(self): self.assertEqual(len(blueprint.table.added_columns), 1) self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE `users` (`name` VARCHAR(255) NOT NULL) COMMENT 'A users table'"], + [ + "CREATE TABLE `users` (`name` VARCHAR(255) NOT NULL) COMMENT 'A users table'" + ], ) def test_can_add_columns_with_foreign_key_constaint(self): @@ -183,7 +193,11 @@ def test_can_add_primary_constraint_without_column_name(self): self.assertEqual(len(blueprint.table.added_columns), 3) self.assertEqual(len(blueprint.table.added_constraints), 1) - self.assertTrue(blueprint.to_sql()[0].startswith("CREATE TABLE `users` (`user_id` INT(11) NOT NULL")) + self.assertTrue( + blueprint.to_sql()[0].startswith( + "CREATE TABLE `users` (`user_id` INT(11) NOT NULL" + ) + ) def test_can_advanced_table_creation2(self): with self.schema.create("users") as blueprint: @@ -198,7 +212,9 @@ def test_can_advanced_table_creation2(self): blueprint.string("thumbnail").nullable() blueprint.integer("premium") blueprint.integer("author_id").unsigned().nullable() - blueprint.foreign("author_id").references("id").on("users").on_delete("CASCADE") + blueprint.foreign("author_id").references("id").on("users").on_delete( + "CASCADE" + ) blueprint.text("description") blueprint.timestamps() @@ -217,7 +233,9 @@ def test_can_advanced_table_creation2(self): def test_can_add_columns_with_foreign_key_constraint_name(self): with self.schema.create("users") as blueprint: blueprint.integer("profile_id") - blueprint.foreign("profile_id", name="profile_foreign").references("id").on("profiles") + blueprint.foreign("profile_id", name="profile_foreign").references("id").on( + "profiles" + ) self.assertEqual(len(blueprint.table.added_columns), 1) self.assertEqual( @@ -298,7 +316,7 @@ def test_can_have_default_blank_string(self): self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE `users` (`profile_id` VARCHAR(255) NOT NULL DEFAULT '')"], + ["CREATE TABLE `users` (" "`profile_id` VARCHAR(255) NOT NULL DEFAULT '')"], ) def test_can_have_float_type(self): @@ -307,7 +325,7 @@ def test_can_have_float_type(self): self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE `users` (`amount` FLOAT(19, 4) NOT NULL)"], + ["CREATE TABLE `users` (" "`amount` FLOAT(19, 4) NOT NULL)"], ) def test_has_table(self): @@ -374,5 +392,7 @@ def test_can_add_enum(self): self.assertEqual(len(blueprint.table.added_columns), 1) self.assertEqual( blueprint.to_sql(), - ["CREATE TABLE `users` (`status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active')"], + [ + "CREATE TABLE `users` (`status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active')" + ], ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py index c48ecf62..0bd4a6b0 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py @@ -26,7 +26,9 @@ def test_can_add_columns(self): self.assertEqual(len(blueprint.table.added_columns), 2) - sql = ["ALTER TABLE `users` ADD `name` VARCHAR(255) NOT NULL, ADD `age` INT(11) NOT NULL"] + sql = [ + "ALTER TABLE `users` ADD `name` VARCHAR(255) NOT NULL, ADD `age` INT(11) NOT NULL" + ] self.assertEqual(blueprint.to_sql(), sql) @@ -67,7 +69,9 @@ def test_can_add_column_after(self): self.assertEqual(len(blueprint.table.added_columns), 1) - sql = ["ALTER TABLE `users` ADD `name` VARCHAR(255) NOT NULL AFTER `age`"] + sql = [ + "ALTER TABLE `users` ADD `name` VARCHAR(255) NOT NULL AFTER `age`" + ] self.assertEqual(blueprint.to_sql(), sql) @@ -126,7 +130,9 @@ def test_alter_drop1(self): def test_alter_add_column_and_foreign_key(self): with self.schema.table("users") as blueprint: blueprint.unsigned_integer("playlist_id").nullable() - blueprint.foreign("playlist_id").references("id").on("playlists").on_delete("cascade") + blueprint.foreign("playlist_id").references("id").on( + "playlists" + ).on_delete("cascade") sql = [ "ALTER TABLE `users` ADD `playlist_id` INT UNSIGNED NULL", @@ -139,7 +145,9 @@ def test_alter_drop_foreign_key(self): with self.schema.table("users") as blueprint: blueprint.drop_foreign("users_playlist_id_foreign") - sql = ["ALTER TABLE `users` DROP FOREIGN KEY users_playlist_id_foreign"] + sql = [ + "ALTER TABLE `users` DROP FOREIGN KEY users_playlist_id_foreign" + ] self.assertEqual(blueprint.to_sql(), sql) @@ -147,7 +155,9 @@ def test_alter_drop_foreign_key_shortcut(self): with self.schema.table("users") as blueprint: blueprint.drop_foreign(["playlist_id"]) - sql = ["ALTER TABLE `users` DROP FOREIGN KEY users_playlist_id_foreign"] + sql = [ + "ALTER TABLE `users` DROP FOREIGN KEY users_playlist_id_foreign" + ] self.assertEqual(blueprint.to_sql(), sql) @@ -179,7 +189,9 @@ def test_alter_add_primary(self): with self.schema.table("users") as blueprint: blueprint.primary("playlist_id") - sql = ["ALTER TABLE `users` ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)"] + sql = [ + "ALTER TABLE `users` ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)" + ] self.assertEqual(blueprint.to_sql(), sql) @@ -294,16 +306,22 @@ def test_can_add_column_enum(self): self.assertEqual(len(blueprint.table.added_columns), 1) - sql = ["ALTER TABLE `users` ADD `status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active'"] + sql = [ + "ALTER TABLE `users` ADD `status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active'" + ] self.assertEqual(blueprint.to_sql(), sql) def test_can_change_column_enum(self): with self.schema.table("users") as blueprint: - blueprint.enum("status", ["active", "inactive"]).default("active").change() + blueprint.enum("status", ["active", "inactive"]).default( + "active" + ).change() self.assertEqual(len(blueprint.table.changed_columns), 1) - sql = ["ALTER TABLE `users` MODIFY `status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active'"] + sql = [ + "ALTER TABLE `users` MODIFY `status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active'" + ] self.assertEqual(blueprint.to_sql(), sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py index 0d881582..89b94d19 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py @@ -31,7 +31,9 @@ def test_can_use_global_scopes_on_select(self): def test_can_use_global_scopes_on_time(self): sql = "INSERT INTO `users` (`users`.`name`, `users`.`updated_at`, `users`.`created_at`) VALUES ('Joe'" - self.assertTrue(User.create({"name": "Joe"}, query=True).to_sql().startswith(sql)) + self.assertTrue( + User.create({"name": "Joe"}, query=True).to_sql().startswith(sql) + ) # def test_can_use_global_scopes_on_inherit(self): # sql = "SELECT * FROM `user_softs` WHERE `user_softs`.`deleted_at` IS NULL" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py index 82f50a15..354fd0d4 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py @@ -36,4 +36,6 @@ def test_active_scope_with_params(self): def test_can_chain_scopes(self): sql = "SELECT * FROM `users` WHERE `users`.`active` = '2' AND `users`.`gender` = 'W' AND `users`.`name` = 'joe'" - self.assertEqual(sql, User.active(2).gender("W").where("name", "joe").to_sql()) + self.assertEqual( + sql, User.active(2).gender("W").where("name", "joe").to_sql() + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py index f8289abc..7d6689b4 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py @@ -48,7 +48,9 @@ def test_restore(self): def test_force_delete_with_wheres(self): sql = "DELETE FROM `users` WHERE `users`.`active` = '1'" - self.assertEqual(sql, UserSoft.where("active", 1).force_delete(query=True).to_sql()) + self.assertEqual( + sql, UserSoft.where("active", 1).force_delete(query=True).to_sql() + ) def test_that_trashed_users_are_not_returned_by_default(self): sql = "SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py index d77f82d4..1431b9f9 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py @@ -38,64 +38,84 @@ def test_sum(self): builder = self.get_builder() builder.sum("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_like(self): builder = self.get_builder() builder.where("age", "like", "%name%") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_like(self): builder = self.get_builder() builder.where("age", "not like", "%name%") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_max(self): builder = self.get_builder() builder.max("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_min(self): builder = self.get_builder() builder.min("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_avg(self): builder = self.get_builder() builder.avg("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_all(self): builder = self.get_builder() builder.all() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_get(self): builder = self.get_builder() builder.get() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_first(self): builder = self.get_builder().first(query=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select(self): builder = self.get_builder() builder.select("name", "email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_add_select_no_table(self): @@ -111,13 +131,17 @@ def test_add_select_no_table(self): ) .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_raw(self): builder = self.get_builder() builder.select_raw("count(email) as email_count") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_create(self): @@ -126,60 +150,82 @@ def test_create(self): {"name": "Corentin All", "email": "corentin@yopmail.com"}, query=True, ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_delete(self): builder = self.get_builder() builder.delete("name", "Joe", query=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where(self): builder = self.get_builder() builder.where("name", "Joe") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_exists(self): builder = self.get_builder() builder.where_exists("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_limit(self): builder = self.get_builder() builder.limit(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_offset(self): builder = self.get_builder() builder.offset(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_join(self): builder = self.get_builder() builder.join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_left_join(self): builder = self.get_builder() builder.left_join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_right_join(self): builder = self.get_builder() builder.right_join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_update(self): - builder = self.get_builder().update({"name": "Joe", "email": "joe@yopmail.com"}, dry=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + builder = self.get_builder().update( + {"name": "Joe", "email": "joe@yopmail.com"}, dry=True + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) # def test_increment(self): @@ -201,78 +247,104 @@ def test_update(self): def test_count(self): builder = self.get_builder() builder.count("id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_asc(self): builder = self.get_builder() builder.order_by("email", "asc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_desc(self): builder = self.get_builder() builder.order_by("email", "desc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_column(self): builder = self.get_builder() builder.where_column("name", "username") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_in(self): builder = self.get_builder() builder.where_not_in("id", [1, 2, 3]) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_between(self): builder = self.get_builder() builder.between("id", 2, 5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_not_between(self): builder = self.get_builder() builder.not_between("id", 2, 5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_in(self): builder = self.get_builder() builder.where_in("id", [1, 2, 3]) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_null(self): builder = self.get_builder() builder.where_null("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_null(self): builder = self.get_builder() builder.where_not_null("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_having(self): builder = self.get_builder(table="payments") - builder.select("user_id").avg("salary").group_by("user_id").having("salary", ">=", "1000") + builder.select("user_id").avg("salary").group_by("user_id").having( + "salary", ">=", "1000" + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_group_by(self): builder = self.get_builder(table="payments") builder.select("user_id").min("salary").group_by("user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_builder_alone(self): @@ -299,42 +371,59 @@ def test_builder_alone(self): def test_where_lt(self): builder = self.get_builder() builder.where("age", "<", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_lte(self): builder = self.get_builder() builder.where("age", "<=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_gt(self): builder = self.get_builder() builder.where("age", ">", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_gte(self): builder = self.get_builder() builder.where("age", ">=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_ne(self): builder = self.get_builder() builder.where("age", "!=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_or_where(self): builder = self.get_builder() builder.where("age", "20").or_where("age", "<", 20) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_can_call_with_schema(self): builder = self.get_builder() - sql = builder.table("information_schema.columns").select("table_name").where("table_name", "users").to_sql() + sql = ( + builder.table("information_schema.columns") + .select("table_name") + .where("table_name", "users") + .to_sql() + ) self.assertEqual( sql, """SELECT "information_schema"."columns"."table_name" FROM "information_schema"."columns" WHERE "information_schema"."columns"."table_name" = 'users'""", @@ -343,25 +432,33 @@ def test_can_call_with_schema(self): def test_truncate(self): builder = self.get_builder(dry=True) sql = builder.truncate() - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_truncate_without_foreign_keys(self): builder = self.get_builder(dry=True) sql = builder.truncate(foreign_keys=True) - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_shared_lock(self): builder = self.get_builder(dry=True) sql = builder.where("votes", ">=", 100).shared_lock().to_sql() - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_update_lock(self): builder = self.get_builder(dry=True) sql = builder.where("votes", ">=", 100).lock_for_update().to_sql() - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) @@ -560,7 +657,9 @@ def where_not_in(self): """ builder.where_not_in('id', [1, 2, 3]) """ - return """SELECT * FROM "users" WHERE "users"."id" NOT IN ('1','2','3')""" + return ( + """SELECT * FROM "users" WHERE "users"."id" NOT IN ('1','2','3')""" + ) def where_in(self): """ @@ -572,7 +671,9 @@ def between(self): """ builder.between('id', 2, 5) """ - return """SELECT * FROM "users" WHERE "users"."id" BETWEEN '2' AND '5'""" + return ( + """SELECT * FROM "users" WHERE "users"."id" BETWEEN '2' AND '5'""" + ) def not_between(self): """ @@ -646,7 +747,9 @@ def where_not_like(self): builder = self.get_builder() builder.where("age", "not like", "%name%") """ - return """SELECT * FROM "users" WHERE "users"."age" NOT ILIKE '%name%'""" + return ( + """SELECT * FROM "users" WHERE "users"."age" NOT ILIKE '%name%'""" + ) def truncate(self): """ @@ -679,13 +782,17 @@ def shared_lock(self): def test_latest(self): builder = self.get_builder() builder.latest("email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_oldest(self): builder = self.get_builder() builder.oldest("email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def oldest(self): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py index 3a1b5398..690e7253 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py @@ -12,19 +12,31 @@ def setUp(self): def test_can_compile_delete(self): to_sql = self.builder.delete("id", 1, query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_delete_in(self): to_sql = self.builder.delete("id", [1, 2, 3], query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_delete_with_where(self): - to_sql = self.builder.where("age", 20).where("profile", 1).set_action("delete").delete(query=True).to_sql() + to_sql = ( + self.builder.where("age", 20) + .where("profile", 1) + .set_action("delete") + .delete(query=True) + .to_sql() + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py index 85ec9138..6404d2e3 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py @@ -12,13 +12,17 @@ def setUp(self): def test_can_compile_insert(self): to_sql = self.builder.create({"name": "Joe"}, query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_insert_with_keywords(self): to_sql = self.builder.create(name="Joe", query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create(self): @@ -32,13 +36,19 @@ def test_can_compile_bulk_create(self): query=True, ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create_qmark(self): - to_sql = self.builder.bulk_create([{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True).to_qmark() + to_sql = self.builder.bulk_create( + [{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True + ).to_qmark() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py index 81e7bda8..f55d06a4 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py @@ -17,7 +17,9 @@ def can_compile_with_columns(self): """ self.builder.select('username', 'password').to_sql() """ - return """SELECT "users"."username", "users"."password" FROM "users\"""" + return ( + """SELECT "users"."username", "users"."password" FROM "users\"""" + ) def can_compile_with_where(self): """ @@ -158,7 +160,9 @@ def can_compile_where_column(self): self.builder.where_column('name', 'email').to_sql() """ - return """SELECT * FROM "users" WHERE "users"."name" = "users"."email\"""" + return ( + """SELECT * FROM "users" WHERE "users"."name" = "users"."email\"""" + ) def can_compile_or_where(self): """ @@ -297,10 +301,16 @@ def can_compile_not_between(self): def test_can_compile_where_raw(self): to_sql = self.builder.where_raw(""" "age" = '18'""").to_sql() - self.assertEqual(to_sql, """SELECT * FROM "users" WHERE "age" = '18'""") + self.assertEqual( + to_sql, """SELECT * FROM "users" WHERE "age" = '18'""" + ) def test_can_compile_having_raw(self): - to_sql = self.builder.select_raw("COUNT(*) as counts").having_raw("counts > 10").to_sql() + to_sql = ( + self.builder.select_raw("COUNT(*) as counts") + .having_raw("counts > 10") + .to_sql() + ) self.assertEqual( to_sql, """SELECT COUNT(*) as counts FROM "users" HAVING counts > 10""", @@ -308,7 +318,10 @@ def test_can_compile_having_raw(self): def test_can_compile_having_raw_order(self): to_sql = ( - self.builder.select_raw("COUNT(*) as counts").having_raw("counts > 10").order_by_raw("counts DESC").to_sql() + self.builder.select_raw("COUNT(*) as counts") + .having_raw("counts > 10") + .order_by_raw("counts DESC") + .to_sql() ) self.assertEqual( to_sql, @@ -316,9 +329,9 @@ def test_can_compile_having_raw_order(self): ) def test_can_compile_where_raw_and_where_with_multiple_bindings(self): - query = self.builder.where_raw(""" "age" = ? AND "is_admin" = ?""", [18, True]).where( - "email", "test@example.com" - ) + query = self.builder.where_raw( + """ "age" = ? AND "is_admin" = ?""", [18, True] + ).where("email", "test@example.com") self.assertEqual( query.to_qmark(), """SELECT * FROM "users" WHERE "age" = ? AND "is_admin" = ? AND "users"."email" = ?""", @@ -331,7 +344,9 @@ def test_can_compile_select_raw(self): def test_can_compile_select_raw_with_select(self): to_sql = self.builder.select("id").select_raw("COUNT(*)").to_sql() - self.assertEqual(to_sql, """SELECT "users"."id", COUNT(*) FROM "users\"""") + self.assertEqual( + to_sql, """SELECT "users"."id", COUNT(*) FROM "users\"""" + ) def can_compile_first_or_fail(self): """ @@ -345,7 +360,9 @@ def where_not_like(self): builder = self.get_builder() builder.where("age", "not like", "%name%").to_sql() """ - return """SELECT * FROM "users" WHERE "users"."age" NOT ILIKE '%name%'""" + return ( + """SELECT * FROM "users" WHERE "users"."age" NOT ILIKE '%name%'""" + ) def where_like(self): """ @@ -443,9 +460,7 @@ def can_compile_left_join_clause_with_lambda(self): ), ).to_sql() """ - return ( - """SELECT * FROM "users" LEFT JOIN "report_groups" AS "rg" ON "bgt"."fund" = "rg"."fund" OR "bgt" IS NULL""" - ) + return """SELECT * FROM "users" LEFT JOIN "report_groups" AS "rg" ON "bgt"."fund" = "rg"."fund" OR "bgt" IS NULL""" def can_compile_right_join_clause_with_lambda(self): """ diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py index fa8cb3c3..76d19f7f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py @@ -2,31 +2,48 @@ import unittest from src.masoniteorm.connections import PostgresConnection -from src.masoniteorm.expressions import Raw from src.masoniteorm.query import QueryBuilder from src.masoniteorm.query.grammars import PostgresGrammar +from src.masoniteorm.expressions import Raw class BaseTestCaseUpdateGrammar: def setUp(self): - self.builder = QueryBuilder(PostgresGrammar, connection_class=PostgresConnection, table="users") + self.builder = QueryBuilder( + PostgresGrammar, connection_class=PostgresConnection, table="users" + ) def test_can_compile_update(self): - to_sql = self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + to_sql = ( + self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_multiple_update(self): - to_sql = self.builder.update({"name": "Joe", "email": "user@email.com"}, dry=True).to_sql() + to_sql = self.builder.update( + {"name": "Joe", "email": "user@email.com"}, dry=True + ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_update_with_multiple_where(self): - to_sql = self.builder.where("name", "bob").where("age", 20).update({"name": "Joe"}, dry=True).to_sql() - - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where("name", "bob") + .where("age", 20) + .update({"name": "Joe"}, dry=True) + .to_sql() + ) + + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) # def test_can_compile_increment(self): @@ -48,7 +65,9 @@ def test_can_compile_update_with_multiple_where(self): def test_raw_expression(self): to_sql = self.builder.update({"name": Raw('"username"')}, dry=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py index 0ba045a6..9e04b3dd 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py @@ -1,9 +1,9 @@ import unittest +from tests.integrations.config.database import DATABASES from src.masoniteorm.connections import PostgresConnection from src.masoniteorm.schema import Schema from src.masoniteorm.schema.platforms import PostgresPlatform -from tests.integrations.config.database import DATABASES class TestPostgresSchemaBuilder(unittest.TestCase): @@ -26,7 +26,9 @@ def test_can_add_columns(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ['CREATE TABLE "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)'], + [ + 'CREATE TABLE "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)' + ], ) def test_can_add_tiny_text(self): @@ -34,7 +36,9 @@ def test_can_add_tiny_text(self): blueprint.tiny_text("description") self.assertEqual(len(blueprint.table.added_columns), 1) - self.assertEqual(blueprint.to_sql(), ['CREATE TABLE "users" ("description" TEXT NOT NULL)']) + self.assertEqual( + blueprint.to_sql(), ['CREATE TABLE "users" ("description" TEXT NOT NULL)'] + ) def test_can_add_unsigned_decimal(self): with self.schema.create("users") as blueprint: @@ -54,7 +58,9 @@ def test_can_create_table_if_not_exists(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ['CREATE TABLE IF NOT EXISTS "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)'], + [ + 'CREATE TABLE IF NOT EXISTS "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)' + ], ) def test_can_add_column_comment(self): @@ -131,7 +137,9 @@ def test_can_add_columns_with_long_text(self): blueprint.long_text("description") self.assertEqual(len(blueprint.table.added_columns), 1) - self.assertEqual(blueprint.to_sql(), ['CREATE TABLE "users" ("description" TEXT NOT NULL)']) + self.assertEqual( + blueprint.to_sql(), ['CREATE TABLE "users" ("description" TEXT NOT NULL)'] + ) def test_can_have_unsigned_columns(self): with self.schema.create("users") as blueprint: @@ -211,7 +219,9 @@ def test_can_advanced_table_creation2(self): blueprint.integer("premium") blueprint.double("amount").default(0.0) blueprint.integer("author_id").unsigned().nullable() - blueprint.foreign("author_id").references("id").on("authors").on_delete("CASCADE") + blueprint.foreign("author_id").references("id").on("authors").on_delete( + "CASCADE" + ) blueprint.text("description") blueprint.timestamps() @@ -251,7 +261,9 @@ def test_can_add_uuid_column(self): def test_can_add_columns_with_foreign_key_constraint_name(self): with self.schema.create("users") as blueprint: blueprint.integer("profile_id") - blueprint.foreign("profile_id", name="profile_foreign").references("id").on("profiles") + blueprint.foreign("profile_id", name="profile_foreign").references("id").on( + "profiles" + ) self.assertEqual(len(blueprint.table.added_columns), 1) self.assertEqual( @@ -365,7 +377,6 @@ def test_can_add_enum(self): self.assertEqual( blueprint.to_sql(), [ - "CREATE TABLE \"users\" (\"status\" VARCHAR(255) CHECK(status IN ('active', 'inactive')) NOT NULL " - "DEFAULT 'active')" + 'CREATE TABLE "users" ("status" VARCHAR(255) CHECK(status IN (\'active\', \'inactive\')) NOT NULL ' 'DEFAULT \'active\')' ], ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py index 05fa9c99..d77d632b 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py @@ -1,10 +1,10 @@ import unittest +from tests.integrations.config.database import DATABASES from src.masoniteorm.connections import PostgresConnection from src.masoniteorm.schema import Schema from src.masoniteorm.schema.platforms import PostgresPlatform from src.masoniteorm.schema.Table import Table -from tests.integrations.config.database import DATABASES class TestPostgresSchemaBuilderAlter(unittest.TestCase): @@ -26,7 +26,9 @@ def test_can_add_columns(self): self.assertEqual(len(blueprint.table.added_columns), 2) - sql = ['ALTER TABLE "users" ADD COLUMN "name" VARCHAR(255) NOT NULL, ADD COLUMN "age" INTEGER NOT NULL'] + sql = [ + 'ALTER TABLE "users" ADD COLUMN "name" VARCHAR(255) NOT NULL, ADD COLUMN "age" INTEGER NOT NULL' + ] self.assertEqual(blueprint.to_sql(), sql) @@ -96,7 +98,9 @@ def test_alter_drop(self): def test_alter_add_column_and_foreign_key(self): with self.schema.table("users") as blueprint: blueprint.unsigned_integer("playlist_id").nullable() - blueprint.foreign("playlist_id").references("id").on("playlists").on_delete("cascade") + blueprint.foreign("playlist_id").references("id").on("playlists").on_delete( + "cascade" + ) sql = [ 'ALTER TABLE "users" ADD COLUMN "playlist_id" INTEGER NULL', @@ -160,7 +164,9 @@ def test_alter_add_primary(self): with self.schema.table("users") as blueprint: blueprint.primary("playlist_id") - sql = ['ALTER TABLE "users" ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)'] + sql = [ + 'ALTER TABLE "users" ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)' + ] self.assertEqual(blueprint.to_sql(), sql) @@ -239,7 +245,9 @@ def test_change_string(self): blueprint.table.from_table = table - sql = ['ALTER TABLE "users" ALTER COLUMN "name" TYPE VARCHAR(93), ALTER COLUMN "name" SET NOT NULL'] + sql = [ + 'ALTER TABLE "users" ALTER COLUMN "name" TYPE VARCHAR(93), ALTER COLUMN "name" SET NOT NULL' + ] self.assertEqual(blueprint.to_sql(), sql) @@ -301,7 +309,7 @@ def test_can_add_column_enum(self): self.assertEqual(len(blueprint.table.added_columns), 1) sql = [ - "ALTER TABLE \"users\" ADD COLUMN \"status\" VARCHAR(255) CHECK(status IN ('active', 'inactive')) NOT NULL DEFAULT 'active'", + 'ALTER TABLE "users" ADD COLUMN "status" VARCHAR(255) CHECK(status IN (\'active\', \'inactive\')) NOT NULL DEFAULT \'active\'', ] self.assertEqual(blueprint.to_sql(), sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py index 6bf19e86..0a7b7568 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py @@ -4,6 +4,7 @@ import uuid import pendulum + from src.masoniteorm.models import Model from src.masoniteorm.scopes import ( SoftDeletesMixin, diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder.py index 558cb90d..3c3597eb 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder.py @@ -4,6 +4,7 @@ from pathlib import Path import pytest + from src.masoniteorm.config import load_config from src.masoniteorm.connections import ConnectionResolver from src.masoniteorm.exceptions import ( @@ -70,7 +71,9 @@ def test_sum(self): builder = self.get_builder() builder.sum("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_sum_aggregate(self): @@ -84,7 +87,9 @@ def test_sum_aggregate_with_alias(self): builder = self.get_builder() builder.aggregate("SUM", "age", alias="number") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_sum_aggregate_with_alias_in_column_name(self): @@ -98,51 +103,67 @@ def test_where_like(self): builder = self.get_builder() builder.where("age", "like", "%name%") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_like(self): builder = self.get_builder() builder.where("age", "not like", "%name%") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_max(self): builder = self.get_builder() builder.max("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_min(self): builder = self.get_builder() builder.min("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_avg(self): builder = self.get_builder() builder.avg("age") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_all(self): builder = self.get_builder() builder.all() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_get(self): builder = self.get_builder() builder.get() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_first(self): builder = self.get_builder().first(query=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_last(self): @@ -166,7 +187,9 @@ def test_find_or_404_exception(self): def test_select(self): builder = self.get_builder() builder.select("name", "email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_multiple(self): @@ -183,7 +206,9 @@ def test_add_select(self): .add_select("salary", lambda q: q.count("*").table("salary")) .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_add_select_no_table(self): @@ -199,7 +224,9 @@ def test_add_select_no_table(self): ) .to_sql() ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_add_select_with_raw(self): @@ -209,16 +236,24 @@ def test_add_select_with_raw(self): .from_("some_table") .add_select( "other_test", - lambda query: query.max("updated_at").from_("different_table").where("some_id", "=", "3"), + lambda query: ( + query.max("updated_at") + .from_("different_table") + .where("some_id", "=", "3") + ), ) ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_select_raw(self): builder = self.get_builder() builder.select_raw("count(email) as email_count") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_create(self): @@ -227,19 +262,25 @@ def test_create(self): {"name": "Corentin All", "email": "corentin@yopmail.com"}, query=True, ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_delete(self): builder = self.get_builder() builder.delete("name", "Joe", query=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where(self): builder = self.get_builder() builder.where("name", "Joe") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_dictionary(self): @@ -251,112 +292,152 @@ def test_where_dictionary(self): def test_where_exists(self): builder = self.get_builder() builder.where_exists("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_limit(self): builder = self.get_builder() builder.limit(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_offset(self): builder = self.get_builder() builder.offset(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_offset_with_limit(self): builder = self.get_builder() builder.limit(2).offset(5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_join(self): builder = self.get_builder() builder.join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_left_join(self): builder = self.get_builder() builder.left_join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_right_join(self): builder = self.get_builder() builder.right_join("profiles", "users.id", "=", "profiles.user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_update(self): - builder = self.get_builder().update({"name": "Joe", "email": "joe@yopmail.com"}, dry=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + builder = self.get_builder().update( + {"name": "Joe", "email": "joe@yopmail.com"}, dry=True + ) + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_increment(self): builder = self.get_builder().increment("age", 1, dry=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_decrement(self): builder = self.get_builder().decrement("age", 1, dry=True) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_count(self): builder = self.get_builder() builder.count("id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_asc(self): builder = self.get_builder() builder.order_by("email", "asc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_multiple(self): builder = self.get_builder() builder.order_by("email, name, active") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_reference_direction(self): builder = self.get_builder() builder.order_by("email, name desc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_raw(self): builder = self.get_builder() builder.order_by_raw("col asc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_order_by_desc(self): builder = self.get_builder() builder.order_by("email", "desc") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_column(self): builder = self.get_builder() builder.where_column("name", "username") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_in(self): builder = self.get_builder() builder.where_not_in("id", [1, 2, 3]) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_between(self): builder = self.get_builder() builder.between("id", 2, 5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_between_persisted(self): @@ -368,7 +449,9 @@ def test_between_persisted(self): def test_not_between(self): builder = self.get_builder() builder.not_between("id", 2, 5) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_not_between_persisted(self): @@ -381,49 +464,67 @@ def test_where_in(self): builder = self.get_builder() builder.where_in("id", [1, 2, 3]) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_null(self): builder = self.get_builder() builder.where_null("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_not_null(self): builder = self.get_builder() builder.where_not_null("name") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_having(self): builder = self.get_builder(table="payments") - builder.select("user_id").avg("salary").group_by("user_id").having("salary", ">=", "1000") + builder.select("user_id").avg("salary").group_by("user_id").having( + "salary", ">=", "1000" + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_group_by(self): builder = self.get_builder(table="payments") builder.select("user_id").min("salary").group_by("user_id") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_group_by_raw(self): builder = self.get_builder(table="payments") builder.select("user_id").min("salary").group_by_raw("count(*)") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_group_by_multiple(self): builder = self.get_builder(table="payments") - builder.select("user_id").min("salary").group_by("user_id").group_by("salary") + builder.select("user_id").min("salary").group_by("user_id").group_by( + "salary" + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_group_by_multiple_in_same_group_by(self): @@ -450,42 +551,59 @@ def test_builder_alone(self): def test_where_lt(self): builder = self.get_builder() builder.where("age", "<", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_lte(self): builder = self.get_builder() builder.where("age", "<=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_gt(self): builder = self.get_builder() builder.where("age", ">", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_gte(self): builder = self.get_builder() builder.where("age", ">=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_where_ne(self): builder = self.get_builder() builder.where("age", "!=", "20") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_or_where(self): builder = self.get_builder() builder.where("age", "20").or_where("age", "<", 20) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_can_call_with_schema(self): builder = self.get_builder() - sql = builder.table("information_schema.columns").select("table_name").where("table_name", "users").to_sql() + sql = ( + builder.table("information_schema.columns") + .select("table_name") + .where("table_name", "users") + .to_sql() + ) self.assertEqual( sql, """SELECT "information_schema"."columns"."table_name" FROM "information_schema"."columns" WHERE "information_schema"."columns"."table_name" = 'users'""", @@ -499,13 +617,17 @@ def test_can_call_with_raw(self): def test_truncate(self): builder = self.get_builder() sql = builder.truncate(dry=True) - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) def test_truncate_without_foreign_keys(self): builder = self.get_builder() sql = builder.truncate(foreign_keys=True) - sql_ref = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql_ref = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(sql, sql_ref) @@ -774,7 +896,9 @@ def where_not_in(self): """ builder.where_not_in('id', [1, 2, 3]) """ - return """SELECT * FROM "users" WHERE "users"."id" NOT IN ('1','2','3')""" + return ( + """SELECT * FROM "users" WHERE "users"."id" NOT IN ('1','2','3')""" + ) def where_in(self): """ @@ -786,7 +910,9 @@ def between(self): """ builder.between('id', 2, 5) """ - return """SELECT * FROM "users" WHERE "users"."id" BETWEEN '2' AND '5'""" + return ( + """SELECT * FROM "users" WHERE "users"."id" BETWEEN '2' AND '5'""" + ) def not_between(self): """ @@ -872,18 +998,24 @@ def where_not_like(self): builder = self.get_builder() builder.where("age", "like", "%name%") """ - return """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'""" + return ( + """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'""" + ) def test_when(self): builder = self.get_builder() - sql = builder.when(19 > 18, lambda q: q.where("age_restricted", 1)).to_sql() + sql = builder.when( + 19 > 18, lambda q: q.where("age_restricted", 1) + ).to_sql() return self.assertEqual( sql, """SELECT * FROM "users" WHERE "users"."age_restricted" = '1'""", ) builder = self.get_builder() - sql = builder.when(17 > 18, lambda q: q.where("age_restricted", 1)).to_sql() + sql = builder.when( + 17 > 18, lambda q: q.where("age_restricted", 1) + ).to_sql() return self.assertEqual(sql, """SELECT * FROM "users\"""") def truncate(self): @@ -907,13 +1039,17 @@ def truncate_without_foreign_keys(self): def test_latest(self): builder = self.get_builder() builder.latest("email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def test_oldest(self): builder = self.get_builder() builder.oldest("email") - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(builder.to_sql(), sql) def oldest(self): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder_relationships.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder_relationships.py index 1da114eb..eb1e24b8 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder_relationships.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder_relationships.py @@ -1,6 +1,7 @@ import unittest from dotenv import load_dotenv + from src.masoniteorm.connections import ConnectionFactory from src.masoniteorm.models import Model from src.masoniteorm.query import QueryBuilder @@ -74,7 +75,9 @@ def test_doesnt_have(self): def test_where_doesnt_have(self): builder = self.get_builder() - sql = builder.where_doesnt_have("articles", lambda q: q.where("title", "Eggs and Ham")).to_sql() + sql = builder.where_doesnt_have( + "articles", lambda q: q.where("title", "Eggs and Ham") + ).to_sql() self.assertEqual( sql, """SELECT * FROM "users" WHERE NOT EXISTS (""" @@ -84,7 +87,9 @@ def test_where_doesnt_have(self): def test_where_has_query(self): builder = self.get_builder() - sql = builder.where_has("articles", lambda q: q.where("active", 1)).to_sql() + sql = builder.where_has( + "articles", lambda q: q.where("active", 1) + ).to_sql() self.assertEqual( sql, """SELECT * FROM "users" WHERE EXISTS (""" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_delete_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_delete_grammar.py index 15fdd558..3bd36a87 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_delete_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_delete_grammar.py @@ -12,19 +12,30 @@ def setUp(self): def test_can_compile_delete(self): to_sql = self.builder.delete("id", 1, query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_delete_in(self): to_sql = self.builder.delete("id", [1, 2, 3], query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_delete_with_where(self): - to_sql = self.builder.where("age", 20).where("profile", 1).delete(query=True).to_sql() + to_sql = ( + self.builder.where("age", 20) + .where("profile", 1) + .delete(query=True) + .to_sql() + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_insert_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_insert_grammar.py index 8215320c..35ee7eb9 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_insert_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_insert_grammar.py @@ -12,13 +12,17 @@ def setUp(self): def test_can_compile_insert(self): to_sql = self.builder.create({"name": "Joe"}, query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_insert_with_keywords(self): to_sql = self.builder.create(name="Joe", query=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create(self): @@ -32,13 +36,19 @@ def test_can_compile_bulk_create(self): query=True, ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create_qmark(self): - to_sql = self.builder.bulk_create([{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True).to_qmark() + to_sql = self.builder.bulk_create( + [{"name": "Joe"}, {"name": "Bill"}, {"name": "John"}], query=True + ).to_qmark() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_bulk_create_multiple(self): @@ -51,7 +61,9 @@ def test_can_compile_bulk_create_multiple(self): query=True, ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_select_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_select_grammar.py index c1af0f3b..ad88acd6 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_select_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_select_grammar.py @@ -24,7 +24,9 @@ def can_compile_with_columns(self): """ self.builder.select('username', 'password').to_sql() """ - return """SELECT "users"."username", "users"."password" FROM "users\"""" + return ( + """SELECT "users"."username", "users"."password" FROM "users\"""" + ) def can_compile_with_where(self): """ @@ -159,7 +161,9 @@ def can_compile_where_column(self): self.builder.where_column('name', 'email').to_sql() """ - return """SELECT * FROM "users" WHERE "users"."name" = "users"."email\"""" + return ( + """SELECT * FROM "users" WHERE "users"."name" = "users"."email\"""" + ) def can_compile_or_where(self): """ @@ -289,12 +293,14 @@ def can_compile_not_between(self): def test_can_compile_where_raw(self): to_sql = self.builder.where_raw(""" "age" = '18'""").to_sql() - self.assertEqual(to_sql, """SELECT * FROM "users" WHERE "age" = '18'""") + self.assertEqual( + to_sql, """SELECT * FROM "users" WHERE "age" = '18'""" + ) def test_can_compile_where_raw_and_where_with_multiple_bindings(self): - query = self.builder.where_raw(""" "age" = ? AND "is_admin" = ? """, [18, True]).where( - "email", "test@example.com" - ) + query = self.builder.where_raw( + """ "age" = ? AND "is_admin" = ? """, [18, True] + ).where("email", "test@example.com") self.assertEqual( query.to_qmark(), """SELECT * FROM "users" WHERE "age" = ? AND "is_admin" = ? AND "users"."email" = ?""", @@ -307,21 +313,27 @@ def test_can_compile_select_raw(self): def test_can_compile_select_raw_with_select(self): to_sql = self.builder.select("id").select_raw("COUNT(*)").to_sql() - self.assertEqual(to_sql, """SELECT "users"."id", COUNT(*) FROM "users\"""") + self.assertEqual( + to_sql, """SELECT "users"."id", COUNT(*) FROM "users\"""" + ) def can_compile_first_or_fail(self): """ builder = self.get_builder() builder.where("is_admin", "=", True).first_or_fail() """ - return """SELECT * FROM "users" WHERE "users"."is_admin" = '1' LIMIT 1""" + return ( + """SELECT * FROM "users" WHERE "users"."is_admin" = '1' LIMIT 1""" + ) def where_not_like(self): """ builder = self.get_builder() builder.where("age", "not like", "%name%").to_sql() """ - return """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'""" + return ( + """SELECT * FROM "users" WHERE "users"."age" NOT LIKE '%name%'""" + ) def where_like(self): """ @@ -419,9 +431,7 @@ def can_compile_left_join_clause_with_lambda(self): ), ).to_sql() """ - return ( - """SELECT * FROM "users" LEFT JOIN "report_groups" AS "rg" ON "bgt"."fund" = "rg"."fund" OR "bgt" IS NULL""" - ) + return """SELECT * FROM "users" LEFT JOIN "report_groups" AS "rg" ON "bgt"."fund" = "rg"."fund" OR "bgt" IS NULL""" def can_compile_right_join_clause_with_lambda(self): """ @@ -434,9 +444,7 @@ def can_compile_right_join_clause_with_lambda(self): ), ).to_sql() """ - return ( - """SELECT * FROM "users" LEFT JOIN "report_groups" AS "rg" ON "bgt"."fund" = "rg"."fund" OR "bgt" IS NULL""" - ) + return """SELECT * FROM "users" LEFT JOIN "report_groups" AS "rg" ON "bgt"."fund" = "rg"."fund" OR "bgt" IS NULL""" def update_lock(self): """ diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_update_grammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_update_grammar.py index df8a289e..4ee26543 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_update_grammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_update_grammar.py @@ -1,9 +1,9 @@ import inspect import unittest -from src.masoniteorm.expressions import Raw from src.masoniteorm.query import QueryBuilder from src.masoniteorm.query.grammars import SQLiteGrammar +from src.masoniteorm.expressions import Raw class BaseTestCaseUpdateGrammar: @@ -11,21 +11,36 @@ def setUp(self): self.builder = QueryBuilder(SQLiteGrammar, table="users") def test_can_compile_update(self): - to_sql = self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + to_sql = ( + self.builder.where("name", "bob").update({"name": "Joe"}, dry=True).to_sql() + ) - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_multiple_update(self): - to_sql = self.builder.update({"name": "Joe", "email": "user@email.com"}, dry=True).to_sql() + to_sql = self.builder.update( + {"name": "Joe", "email": "user@email.com"}, dry=True + ).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) def test_can_compile_update_with_multiple_where(self): - to_sql = self.builder.where("name", "bob").where("age", 20).update({"name": "Joe"}, dry=True).to_sql() - - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + to_sql = ( + self.builder.where("name", "bob") + .where("age", 20) + .update({"name": "Joe"}, dry=True) + .to_sql() + ) + + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) # def test_can_compile_increment(self): @@ -45,7 +60,9 @@ def test_can_compile_update_with_multiple_where(self): def test_raw_expression(self): to_sql = self.builder.update({"name": Raw('"username"')}, dry=True).to_sql() - sql = getattr(self, inspect.currentframe().f_code.co_name.replace("test_", ""))() + sql = getattr( + self, inspect.currentframe().f_code.co_name.replace("test_", "") + )() self.assertEqual(to_sql, sql) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_many_through_relationship.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_many_through_relationship.py index 4fcab9a9..fbb7e107 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_many_through_relationship.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_many_through_relationship.py @@ -1,5 +1,4 @@ import pytest_asyncio -from fastapi_startkit.masoniteorm.tests.integrations.config.database import DATABASES from fastapi_startkit.masoniteorm.collection import Collection from fastapi_startkit.masoniteorm.connections.sqlite_connection import SQLiteConnection @@ -7,6 +6,7 @@ from fastapi_startkit.masoniteorm.relationships import HasManyThrough from fastapi_startkit.masoniteorm.schema import Schema from fastapi_startkit.masoniteorm.schema.platforms import SQLitePlatform +from fastapi_startkit.masoniteorm.tests.integrations.config.database import DATABASES class Enrolment(Model): @@ -33,7 +33,11 @@ class Course(Model): name: str students: list[Student] = HasManyThrough( - ["Student", "Enrolment"], "in_course_id", "active_student_id", "course_id", "student_id" + ['Student', 'Enrolment'], + "in_course_id", + "active_student_id", + "course_id", + "student_id" ) @@ -47,62 +51,50 @@ async def setup(self): connection="dev", connection_details=DATABASES, platform=SQLitePlatform, - config_path="fastapi_startkit/masoniteorm/tests/integrations/config/database", + config_path='fastapi_startkit/masoniteorm/tests/integrations/config/database' ).on("dev") - async with await self.schema.create_table_if_not_exists("student") as table: + async with (await self.schema.create_table_if_not_exists("student")) as table: table.integer("student_id").primary() table.string("name") - async with await self.schema.create_table_if_not_exists("course") as table: + async with (await self.schema.create_table_if_not_exists("course")) as table: table.integer("course_id").primary() table.string("name") - async with await self.schema.create_table_if_not_exists("enrolment") as table: + async with (await self.schema.create_table_if_not_exists("enrolment")) as table: table.integer("enrolment_id").primary() table.integer("active_student_id") table.integer("in_course_id") if not await Course.count(): - await ( - Course() - .get_builder() - .bulk_create( - [ - {"course_id": 10, "name": "Math 101"}, - {"course_id": 20, "name": "History 101"}, - {"course_id": 30, "name": "Math 302"}, - {"course_id": 40, "name": "Biology 302"}, - ] - ) + await Course().get_builder().bulk_create( + [ + {"course_id": 10, "name": "Math 101"}, + {"course_id": 20, "name": "History 101"}, + {"course_id": 30, "name": "Math 302"}, + {"course_id": 40, "name": "Biology 302"}, + ] ) if not await Student.count(): - await ( - Student() - .get_builder() - .bulk_create( - [ - {"student_id": 100, "name": "Bob"}, - {"student_id": 200, "name": "Alice"}, - {"student_id": 300, "name": "Steve"}, - {"student_id": 400, "name": "Megan"}, - ] - ) + await Student().get_builder().bulk_create( + [ + {"student_id": 100, "name": "Bob"}, + {"student_id": 200, "name": "Alice"}, + {"student_id": 300, "name": "Steve"}, + {"student_id": 400, "name": "Megan"}, + ] ) if not await Enrolment.count(): - await ( - Enrolment() - .get_builder() - .bulk_create( - [ - {"active_student_id": 100, "in_course_id": 30}, - {"active_student_id": 200, "in_course_id": 10}, - {"active_student_id": 100, "in_course_id": 10}, - {"active_student_id": 400, "in_course_id": 20}, - ] - ) + await Enrolment().get_builder().bulk_create( + [ + {"active_student_id": 100, "in_course_id": 30}, + {"active_student_id": 200, "in_course_id": 10}, + {"active_student_id": 100, "in_course_id": 10}, + {"active_student_id": 400, "in_course_id": 20}, + ] ) yield @@ -129,10 +121,16 @@ async def test_has_many_through_can_eager_load(self): assert student2.name == "Bob" # check .first() and .get() produce the same result - single = await Course.where("name", "History 101").with_("students").first() + single = await ( + Course.where("name", "History 101") + .with_("students") + .first() + ) assert isinstance(single.students, Collection) - single_get = await Course.where("name", "History 101").with_("students").get() + single_get = await ( + Course.where("name", "History 101").with_("students").get() + ) single_students = single.students single_get_students = single_get.first().students @@ -145,7 +143,11 @@ async def test_has_many_through_can_eager_load(self): assert single_name == single_get_name async def test_has_many_through_eager_load_can_be_empty(self): - courses = await Course.where("name", "Biology 302").with_("students").get() + courses = await ( + Course.where("name", "Biology 302") + .with_("students") + .get() + ) students: Collection = courses.first().students assert students is None @@ -158,5 +160,7 @@ async def test_has_many_through_can_get_related(self): assert students.count() == 2 async def test_has_many_through_has_query(self): - courses = await Course.where_has("students", lambda query: query.where("name", "Bob")).get() + courses = await Course.where_has( + "students", lambda query: query.where("name", "Bob") + ).get() assert courses.count() == 2 diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_one_through_relationship.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_one_through_relationship.py index e39b5401..78dba32a 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_one_through_relationship.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_one_through_relationship.py @@ -23,10 +23,10 @@ class IncomingShipment(Model): from_country: "Country" = HasOneThrough( ["Country", "Port"], - "from_port_id", # FK on IncomingShipment → Port - "port_country_id", # FK on Port → Country - "port_id", # PK on Port - "country_id", # PK on Country + "from_port_id", # FK on IncomingShipment → Port + "port_country_id", # FK on Port → Country + "port_id", # PK on Port + "country_id", # PK on Country ) @@ -39,67 +39,55 @@ async def setup(self): self.schema = Schema( connection="dev", platform=SQLitePlatform, - config_path="fastapi_startkit/masoniteorm/tests/integrations/config/database", + config_path='fastapi_startkit/masoniteorm/tests/integrations/config/database' ).on("dev") - async with await self.schema.create_table_if_not_exists("incoming_shipments") as table: + async with (await self.schema.create_table_if_not_exists("incoming_shipments")) as table: table.integer("shipment_id").primary() table.string("name") table.integer("from_port_id") - async with await self.schema.create_table_if_not_exists("ports") as table: + async with (await self.schema.create_table_if_not_exists("ports")) as table: table.integer("port_id").primary() table.string("name") table.integer("port_country_id") - async with await self.schema.create_table_if_not_exists("countries") as table: + async with (await self.schema.create_table_if_not_exists("countries")) as table: table.integer("country_id").primary() table.string("name") - await ( - Country() - .get_builder() - .bulk_create( - [ - {"country_id": 10, "name": "Australia"}, - {"country_id": 20, "name": "USA"}, - {"country_id": 30, "name": "Canada"}, - {"country_id": 40, "name": "United Kingdom"}, - ] - ) + await Country().get_builder().bulk_create( + [ + {"country_id": 10, "name": "Australia"}, + {"country_id": 20, "name": "USA"}, + {"country_id": 30, "name": "Canada"}, + {"country_id": 40, "name": "United Kingdom"}, + ] ) - await ( - Port() - .get_builder() - .bulk_create( - [ - {"port_id": 100, "name": "Melbourne", "port_country_id": 10}, - {"port_id": 200, "name": "Darwin", "port_country_id": 10}, - {"port_id": 300, "name": "South Louisiana", "port_country_id": 20}, - {"port_id": 400, "name": "Houston", "port_country_id": 20}, - {"port_id": 500, "name": "Montreal", "port_country_id": 30}, - {"port_id": 600, "name": "Vancouver", "port_country_id": 30}, - {"port_id": 700, "name": "Southampton", "port_country_id": 40}, - {"port_id": 800, "name": "London Gateway", "port_country_id": 40}, - ] - ) + await Port().get_builder().bulk_create( + [ + {"port_id": 100, "name": "Melbourne", "port_country_id": 10}, + {"port_id": 200, "name": "Darwin", "port_country_id": 10}, + {"port_id": 300, "name": "South Louisiana", "port_country_id": 20}, + {"port_id": 400, "name": "Houston", "port_country_id": 20}, + {"port_id": 500, "name": "Montreal", "port_country_id": 30}, + {"port_id": 600, "name": "Vancouver", "port_country_id": 30}, + {"port_id": 700, "name": "Southampton", "port_country_id": 40}, + {"port_id": 800, "name": "London Gateway", "port_country_id": 40}, + ] ) - await ( - IncomingShipment() - .get_builder() - .bulk_create( - [ - {"name": "Bread", "from_port_id": 300}, - {"name": "Milk", "from_port_id": 100}, - {"name": "Tractor Parts", "from_port_id": 100}, - {"name": "Fridges", "from_port_id": 700}, - {"name": "Wheat", "from_port_id": 600}, - {"name": "Kettles", "from_port_id": 400}, - {"name": "Bread", "from_port_id": 700}, - ] - ) + await IncomingShipment().get_builder().bulk_create( + [ + {"name": "Bread", "from_port_id": 300}, + {"name": "Milk", "from_port_id": 100}, + {"name": "Tractor Parts", "from_port_id": 100}, + {"name": "Fridges", "from_port_id": 700}, + {"name": "Wheat", "from_port_id": 600}, + {"name": "Kettles", "from_port_id": 400}, + {"name": "Bread", "from_port_id": 700}, + ] ) yield @@ -110,7 +98,9 @@ async def setup(self): SQLiteConnection._shared_engines.clear() async def test_has_one_through_can_eager_load(self): - shipments = await IncomingShipment.where("name", "Bread").with_("from_country").get() + shipments = await ( + IncomingShipment.where("name", "Bread").with_("from_country").get() + ) assert shipments.count() == 2 shipment1 = shipments.shift() @@ -122,8 +112,16 @@ async def test_has_one_through_can_eager_load(self): assert shipment2.from_country.country_id == 40 # check .first() and .get() produce the same result - single = await IncomingShipment.where("name", "Tractor Parts").with_("from_country").first() - single_get = await IncomingShipment.where("name", "Tractor Parts").with_("from_country").get() + single = await ( + IncomingShipment.where("name", "Tractor Parts") + .with_("from_country") + .first() + ) + single_get = await ( + IncomingShipment.where("name", "Tractor Parts") + .with_("from_country") + .get() + ) assert single.from_country.country_id == 10 assert single_get.count() == 1 assert single.from_country.country_id == single_get.first().from_country.country_id @@ -131,7 +129,9 @@ async def test_has_one_through_can_eager_load(self): async def test_has_one_through_eager_load_can_be_empty(self): shipments = await ( IncomingShipment.where("name", "Bread") - .where_has("from_country", lambda query: query.where("name", "Uruguay")) + .where_has( + "from_country", lambda query: query.where("name", "Uruguay") + ) .with_("from_country") .get() ) @@ -144,5 +144,7 @@ async def test_has_one_through_can_get_related(self): assert country.country_id == 10 async def test_has_one_through_has_query(self): - shipments = await IncomingShipment.where_has("from_country", lambda query: query.where("name", "USA")).get() + shipments = await IncomingShipment.where_has( + "from_country", lambda query: query.where("name", "USA") + ).get() assert shipments.count() == 2 diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_polymorphic.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_polymorphic.py index 7876ed81..471d453d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_polymorphic.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_polymorphic.py @@ -1,34 +1,32 @@ import pytest_asyncio -from fastapi_startkit.masoniteorm.tests.integrations.config.database import DB from fastapi_startkit.masoniteorm.connections.sqlite_connection import SQLiteConnection from fastapi_startkit.masoniteorm.models import Model from fastapi_startkit.masoniteorm.relationships import BelongsTo, MorphTo from fastapi_startkit.masoniteorm.schema import Schema from fastapi_startkit.masoniteorm.schema.platforms import SQLitePlatform +from fastapi_startkit.masoniteorm.tests.integrations.config.database import DB class Profile(Model): __table__ = "profiles" __connection__ = "dev" - class Logo(Model): __table__ = "logos" __connection__ = "dev" - class Articles(Model): __table__ = "articles" __connection__ = "dev" - logo: "Logo" = BelongsTo("Logo", "id", "article_id") + logo: 'Logo' = BelongsTo('Logo', 'id', 'article_id') class Like(Model): __connection__ = "dev" - record: "Like" = MorphTo("Like", "record_type", "record_id") + record: 'Like' = MorphTo('Like', 'record_type', 'record_id') class User(Model): @@ -49,56 +47,38 @@ async def setup(self): self.schema = Schema( connection="dev", platform=SQLitePlatform, - config_path="fastapi_startkit/masoniteorm/tests/integrations/config/database", + config_path='fastapi_startkit/masoniteorm/tests/integrations/config/database' ).on("dev") - async with await self.schema.create_table_if_not_exists("users") as table: + async with (await self.schema.create_table_if_not_exists("users")) as table: table.integer("id").primary() table.string("name") - async with await self.schema.create_table_if_not_exists("articles") as table: + async with (await self.schema.create_table_if_not_exists("articles")) as table: table.integer("id").primary() table.string("title") - async with await self.schema.create_table_if_not_exists("likes") as table: + async with (await self.schema.create_table_if_not_exists("likes")) as table: table.integer("id").primary() table.string("record_type") table.integer("record_id") - await ( - User() - .get_builder() - .bulk_create( - [ - {"id": 1, "name": "Alice"}, - {"id": 2, "name": "Bob"}, - ] - ) - ) - - await ( - Articles() - .get_builder() - .bulk_create( - [ - {"id": 1, "title": "First Article"}, - {"id": 2, "title": "Second Article"}, - ] - ) - ) - - await ( - Like() - .get_builder() - .bulk_create( - [ - {"id": 1, "record_type": "user", "record_id": 1}, - {"id": 2, "record_type": "user", "record_id": 2}, - {"id": 3, "record_type": "article", "record_id": 1}, - {"id": 4, "record_type": "article", "record_id": 2}, - ] - ) - ) + await User().get_builder().bulk_create([ + {"id": 1, "name": "Alice"}, + {"id": 2, "name": "Bob"}, + ]) + + await Articles().get_builder().bulk_create([ + {"id": 1, "title": "First Article"}, + {"id": 2, "title": "Second Article"}, + ]) + + await Like().get_builder().bulk_create([ + {"id": 1, "record_type": "user", "record_id": 1}, + {"id": 2, "record_type": "user", "record_id": 2}, + {"id": 3, "record_type": "article", "record_id": 1}, + {"id": 4, "record_type": "article", "record_id": 2}, + ]) yield diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder.py index cd5c4fa7..8f922607 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder.py @@ -1,9 +1,8 @@ import unittest -from fastapi_startkit.masoniteorm.tests.integrations.config.database import DATABASES - from fastapi_startkit.masoniteorm.schema import Schema from fastapi_startkit.masoniteorm.schema.platforms import SQLitePlatform +from fastapi_startkit.masoniteorm.tests.integrations.config.database import DATABASES class TestSQLiteSchemaBuilder(unittest.TestCase): @@ -25,7 +24,9 @@ def test_can_add_columns(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ['CREATE TABLE "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)'], + [ + 'CREATE TABLE "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)' + ], ) def test_can_add_tiny_text(self): @@ -56,7 +57,9 @@ def test_can_create_table_if_not_exists(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ['CREATE TABLE IF NOT EXISTS "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)'], + [ + 'CREATE TABLE IF NOT EXISTS "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL)' + ], ) def test_can_add_columns_with_constraint(self): @@ -68,7 +71,9 @@ def test_can_add_columns_with_constraint(self): self.assertEqual(len(blueprint.table.added_columns), 2) self.assertEqual( blueprint.to_sql(), - ['CREATE TABLE "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL, UNIQUE(name))'], + [ + 'CREATE TABLE "users" ("name" VARCHAR(255) NOT NULL, "age" INTEGER NOT NULL, UNIQUE(name))' + ], ) def test_can_have_float_type(self): @@ -108,7 +113,9 @@ def test_can_add_columns_with_foreign_key_constraint_name(self): blueprint.string("name").unique() blueprint.integer("age") blueprint.integer("profile_id") - blueprint.foreign("profile_id", name="profile_foreign").references("id").on("profiles") + blueprint.foreign("profile_id", name="profile_foreign").references( + "id" + ).on("profiles") self.assertEqual(len(blueprint.table.added_columns), 3) self.assertEqual( @@ -252,7 +259,9 @@ def test_can_advanced_table_creation2(self): blueprint.string("thumbnail").nullable() blueprint.integer("premium") blueprint.integer("author_id").unsigned().nullable() - blueprint.foreign("author_id").references("id").on("users").on_delete("set null") + blueprint.foreign("author_id").references("id").on( + "users" + ).on_delete("set null") blueprint.text("description") blueprint.timestamps() diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder_alter.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder_alter.py index ed752ac1..677b1445 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder_alter.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder_alter.py @@ -143,7 +143,9 @@ def test_timestamp_alter_add_nullable_column(self): self.assertEqual(blueprint.to_sql(), sql) def test_alter_drop_on_table_schema_table(self): - schema = Schema(connection="dev", connection_details=DATABASES).on("dev") + schema = Schema(connection="dev", connection_details=DATABASES).on( + "dev" + ) with schema.table("table_schema") as blueprint: blueprint.drop_column("name") @@ -155,14 +157,18 @@ def test_alter_add_primary(self): with self.schema.table("users") as blueprint: blueprint.primary("playlist_id") - sql = ['ALTER TABLE "users" ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)'] + sql = [ + 'ALTER TABLE "users" ADD CONSTRAINT users_playlist_id_primary PRIMARY KEY (playlist_id)' + ] self.assertEqual(blueprint.to_sql(), sql) def test_alter_add_column_and_foreign_key(self): with self.schema.table("users") as blueprint: blueprint.unsigned_integer("playlist_id").nullable() - blueprint.foreign("playlist_id").references("id").on("playlists").on_delete("cascade").on_update("SET NULL") + blueprint.foreign("playlist_id").references("id").on( + "playlists" + ).on_delete("cascade").on_update("SET NULL") table = Table("users") table.add_column("age", "string") @@ -184,7 +190,9 @@ def test_alter_add_column_and_foreign_key(self): def test_alter_add_foreign_key_only(self): with self.schema.table("users") as blueprint: - blueprint.foreign("playlist_id").references("id").on("playlists").on_delete("cascade").on_update("set null") + blueprint.foreign("playlist_id").references("id").on( + "playlists" + ).on_delete("cascade").on_update("set null") table = Table("users") table.add_column("age", "string") @@ -217,7 +225,9 @@ def test_can_add_column_enum(self): def test_can_change_column_enum(self): with self.schema.table("users") as blueprint: - blueprint.enum("status", ["active", "inactive"]).default("active").change() + blueprint.enum("status", ["active", "inactive"]).default( + "active" + ).change() blueprint.table.from_table = Table("users") diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_table.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_table.py index bf8be546..2e73a4ab 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_table.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_table.py @@ -1,9 +1,9 @@ import unittest +from tests.integrations.config.database import DATABASES from src.masoniteorm.connections import SQLiteConnection from src.masoniteorm.schema import Column, Table from src.masoniteorm.schema.platforms.SQLitePlatform import SQLitePlatform -from tests.integrations.config.database import DATABASES class TestTable(unittest.TestCase): @@ -100,7 +100,9 @@ def test_create_sql_with_foreign_key_constraint(self): def test_can_build_table_from_connection_call(self): sql_details = DATABASES["dev"] table = self.platform.get_current_schema( - SQLiteConnection(database=sql_details["database"], name="dev").make_connection(), + SQLiteConnection( + database=sql_details["database"], name="dev" + ).make_connection(), "table_schema", ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/__init__.py index 882b4773..3b0ab691 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/__init__.py @@ -1,2 +1,2 @@ -from .config.config import MySQLConfig, PostgresConfig, SQLiteConfig from .providers import DatabaseProvider +from .config.config import PostgresConfig, MySQLConfig, SQLiteConfig diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py index 0cdc6249..adb77b16 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py @@ -1,9 +1,6 @@ import os - -from cleo.helpers import option - from .Command import Command - +from cleo.helpers import option class DBMigrateCommand(Command): name = "db:migrate" @@ -24,7 +21,9 @@ class DBMigrateCommand(Command): default="default", description="The connection you want to run migrations on", ), - option("force", "f", flag=True, description="Force migrations without prompt in production"), + option( + "force", "f", flag=True, description="Force migrations without prompt in production" + ), option( "show", "s", @@ -42,17 +41,17 @@ class DBMigrateCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): from ..migrations import Migration - # prompt user for confirmation in production if os.getenv("APP_ENV") == "production" and not self.option("force"): answer = "" while answer not in ["y", "n"]: - answer = input("Do you want to run migrations in PRODUCTION ? (y/n)\n").lower() + answer = input( + "Do you want to run migrations in PRODUCTION ? (y/n)\n" + ).lower() if answer != "y": self.info("Migrations cancelled") exit(0) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py index 0d57df12..92c3ef1c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py @@ -8,7 +8,9 @@ class DBSeedCommand(Command): name = "db:seed" description = "Run seeds." - arguments = [argument("table", default="None", description="Name of the table to seed", optional=True)] + arguments = [ + argument("table", default="None", description="Name of the table to seed", optional=True) + ] options = [ option( @@ -35,12 +37,10 @@ class DBSeedCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): from ..seeds import Seeder - seeder = Seeder( seed_path=self.option("directory"), connection=self.option("connection"), diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/Entry.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/Entry.py index fed23855..67c83ea3 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/Entry.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/Entry.py @@ -8,18 +8,18 @@ from cleo.application import Application from . import ( - DBMigrateCommand, - DBSeedCommand, MakeMigrationCommand, MakeModelCommand, MakeModelDocstringCommand, MakeObserverCommand, MakeSeedCommand, + DBMigrateCommand, MigrateFreshCommand, MigrateRefreshCommand, MigrateResetCommand, MigrateRollbackCommand, MigrateStatusCommand, + DBSeedCommand, ShellCommand, ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py index f1c03b1e..e753b28d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py @@ -1,10 +1,8 @@ import datetime import os import pathlib - -from cleo.helpers import argument, option from inflection import camelize, tableize - +from cleo.helpers import argument, option from .Command import Command @@ -55,7 +53,11 @@ def handle(self): file_name = f"{now.strftime('%Y_%m_%d_%H%M%S')}_{name}.py" - with open(os.path.join(os.getcwd(), migration_directory, file_name), "w") as fp: + with open( + os.path.join(os.getcwd(), migration_directory, file_name), "w" + ) as fp: fp.write(output) - self.info(f"Migration file created: {os.path.join(migration_directory, file_name)}") + self.info( + f"Migration file created: {os.path.join(migration_directory, file_name)}" + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py index b01f0bf0..0dbf5045 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py @@ -1,11 +1,8 @@ import os import pathlib - -from cleo.helpers import argument, option from inflection import camelize, tableize, underscore - from .Command import Command - +from cleo.helpers import argument, option class MakeModelCommand(Command): name = "db:make:model" @@ -17,7 +14,9 @@ class MakeModelCommand(Command): option("migration", "m", description="Optionally create a migration file", flag=True), option("seeder", "s", description="Optionally create a seeder file", flag=True), option("create", "c", description="If the migration file should create a table", flag=True), - option("table", "t", description="If the migration file should modify an existing table", flag=True), + option( + "table", "t", description="If the migration file should modify an existing table", flag=True + ), option("pep", "p", description="Makes the file into pep 8 standards", flag=True), option( "directory", @@ -47,7 +46,11 @@ def handle(self): model_directory = self.option("directory") - with open(os.path.join(pathlib.Path(__file__).parent.absolute(), "stubs/model.stub")) as fp: + with open( + os.path.join( + pathlib.Path(__file__).parent.absolute(), "stubs/model.stub" + ) + ) as fp: output = fp.read() output = output.replace("__CLASS__", camelize(name)) @@ -59,12 +62,18 @@ def handle(self): full_directory_path = os.path.join(os.getcwd(), model_directory) if os.path.exists(os.path.join(full_directory_path, file_name)): - self.line(f'Model "{name}" Already Exists ({full_directory_path}/{file_name})') + self.line( + f'Model "{name}" Already Exists ({full_directory_path}/{file_name})' + ) return - os.makedirs(os.path.dirname(os.path.join(full_directory_path)), exist_ok=True) + os.makedirs( + os.path.dirname(os.path.join(full_directory_path)), exist_ok=True + ) - with open(os.path.join(os.getcwd(), model_directory, file_name), "w+") as fp: + with open( + os.path.join(os.getcwd(), model_directory, file_name), "w+" + ) as fp: fp.write(output) self.info(f"Model created: {os.path.join(model_directory, file_name)}") @@ -83,4 +92,6 @@ def handle(self): if self.option("seeder"): directory = self.option("seeders-directory") - self.call("seed", f"{self.argument('name')} --directory {directory}") + self.call( + "seed", f"{self.argument('name')} --directory {directory}" + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py index 91895550..d91de156 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py @@ -1,5 +1,4 @@ from cleo.helpers import argument, option - from ..config import load_config from .Command import Command @@ -8,7 +7,9 @@ class MakeModelDocstringCommand(Command): name = "model:docstring" description = "Generate model docstring and type hints (for auto-completion)." - arguments = [argument("table", description="The table you want to generate docstring and type hints")] + arguments = [ + argument("table", description="The table you want to generate docstring and type hints") + ] options = [ option( @@ -27,7 +28,9 @@ def handle(self): schema = DB.get_schema_builder(self.option("connection")) if not schema.has_table(table): - return self.line_error(f"There is no such table {table} for this connection.") + return self.line_error( + f"There is no such table {table} for this connection." + ) self.info(f"Model Docstring for table: {table}") print('"""') diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py index cc1203fb..d801f35d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py @@ -1,9 +1,7 @@ +from cleo.helpers import argument, option import os import pathlib - -from cleo.helpers import argument, option from inflection import camelize, underscore - from .Command import Command @@ -32,7 +30,11 @@ def handle(self): observer_directory = self.option("directory") - with open(os.path.join(pathlib.Path(__file__).parent.absolute(), "stubs/observer.stub")) as fp: + with open( + os.path.join( + pathlib.Path(__file__).parent.absolute(), "stubs/observer.stub" + ) + ) as fp: output = fp.read() output = output.replace("__CLASS__", camelize(name)) output = output.replace("__MODEL_VARIABLE__", underscore(model)) @@ -43,12 +45,16 @@ def handle(self): full_directory_path = os.path.join(os.getcwd(), observer_directory) if os.path.exists(os.path.join(full_directory_path, file_name)): - self.line(f'Observer "{name}" Already Exists ({full_directory_path}/{file_name})') + self.line( + f'Observer "{name}" Already Exists ({full_directory_path}/{file_name})' + ) return os.makedirs(os.path.join(full_directory_path), exist_ok=True) - with open(os.path.join(os.getcwd(), observer_directory, file_name), "w+") as fp: + with open( + os.path.join(os.getcwd(), observer_directory, file_name), "w+" + ) as fp: fp.write(output) self.info(f"Observer created: {file_name}") diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py index adf89180..52e10577 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py @@ -1,9 +1,7 @@ +from cleo.helpers import argument, option import os import pathlib - -from cleo.helpers import argument, option from inflection import camelize, underscore - from .Command import Command @@ -43,12 +41,18 @@ def handle(self): output = output.replace("__SEEDER_NAME__", camelize(name)) file_name = f"{underscore(name)}.py" - full_path = pathlib.Path(os.path.join(os.getcwd(), seed_directory, file_name)) + full_path = pathlib.Path( + os.path.join(os.getcwd(), seed_directory, file_name) + ) - path_normalized = pathlib.Path(seed_directory) / pathlib.Path(file_name) + path_normalized = pathlib.Path(seed_directory) / pathlib.Path( + file_name + ) if os.path.exists(full_path): - return self.line(f"{path_normalized} already exists.") + return self.line( + f"{path_normalized} already exists." + ) with open(full_path, "w") as fp: fp.write(output) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py index 84e9f85a..705501b0 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py @@ -1,5 +1,4 @@ from cleo.helpers import option - from .Command import Command @@ -41,12 +40,10 @@ class MigrateFreshCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): from ..migrations import Migration - migration = Migration( command_class=self, connection=self.option("connection"), diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py index d263fd11..523d68c9 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py @@ -1,5 +1,4 @@ from cleo.helpers import option - from .Command import Command @@ -22,7 +21,9 @@ class MigrateRefreshCommand(Command): default="default", description="The connection you want to run migrations on", ), - option("schema", None, flag=False, default=None, description="Sets the schema to be migrated"), + option( + "schema", None, flag=False, default=None, description="Sets the schema to be migrated" + ), option( "directory", "d", @@ -48,12 +49,10 @@ class MigrateRefreshCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): from ..migrations import Migration - migration = Migration( command_class=self, connection=self.option("connection"), diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py index ae8ad3eb..93eba45c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py @@ -1,5 +1,4 @@ from cleo.helpers import option - from .Command import Command @@ -22,7 +21,9 @@ class MigrateResetCommand(Command): default="default", description="The connection you want to run migrations on", ), - option("schema", None, flag=False, default=None, description="Sets the schema to be migrated"), + option( + "schema", None, flag=False, default=None, description="Sets the schema to be migrated" + ), option( "directory", "d", @@ -34,12 +35,10 @@ class MigrateResetCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): from ..migrations import Migration - migration = Migration( command_class=self, connection=self.option("connection"), diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py index 3292adef..1b1897c4 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py @@ -1,5 +1,4 @@ from cleo.helpers import option - from .Command import Command @@ -28,7 +27,9 @@ class MigrateRollbackCommand(Command): flag=True, description="Shows the output of SQL for migrations that would be running", ), - option("schema", None, flag=False, default=None, description="Sets the schema to be migrated"), + option( + "schema", None, flag=False, default=None, description="Sets the schema to be migrated" + ), option( "directory", "d", @@ -40,16 +41,16 @@ class MigrateRollbackCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): from ..migrations import Migration - await Migration( command_class=self, connection=self.option("connection"), migration_directory=self.option("directory"), config_path=self.option("config"), schema=self.option("schema"), - ).rollback(migration=self.option("migration"), output=self.option("show")) + ).rollback( + migration=self.option("migration"), output=self.option("show") + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py index 462573d8..c0d6109c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py @@ -1,5 +1,4 @@ from cleo.helpers import option - from ..migrations import Migration from .Command import Command @@ -16,7 +15,9 @@ class MigrateStatusCommand(Command): default="default", description="The connection you want to run migrations on", ), - option("schema", None, flag=False, default=None, description="Sets the schema to be migrated"), + option( + "schema", None, flag=False, default=None, description="Sets the schema to be migrated" + ), option( "directory", "d", @@ -28,7 +29,6 @@ class MigrateStatusCommand(Command): def handle(self): import asyncio - return asyncio.run(self.handle_async()) async def handle_async(self): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py index 755e8129..33df86d0 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py @@ -1,11 +1,9 @@ +from cleo.helpers import argument, option import os import re import shlex import subprocess from collections import OrderedDict - -from cleo.helpers import option - from .Command import Command @@ -44,7 +42,9 @@ def handle(self): connection = resolver.get_connection_details()["default"] config = resolver.get_connection_information(connection) if not config.get("full_details"): - self.line(f"Connection configuration for '{connection}' not found !") + self.line( + f"Connection configuration for '{connection}' not found !" + ) exit(-1) command, env = self.get_command(config) @@ -78,14 +78,19 @@ def get_command(self, config): try: get_driver_args = getattr(self, f"get_{driver}_args") except AttributeError: - self.line(f"Connecting with driver '{driver}' is not implemented !") + self.line( + f"Connecting with driver '{driver}' is not implemented !" + ) exit(-1) args, options = get_driver_args(config) # process positional arguments args = " ".join(args) # process optional arguments options = self.remove_empty_options(options) - options_string = " ".join(f"{option} {value}" if value else option for option, value in options.items()) + options_string = " ".join( + f"{option} {value}" if value else option + for option, value in options.items() + ) # finally build command string command = program if args: @@ -112,7 +117,9 @@ def get_mysql_args(self, config): "--port": config.get("port"), "--user": config.get("user"), "--password": config.get("password"), - "--default-character-set": config.get("options", {}).get("charset"), + "--default-character-set": config.get("options", {}).get( + "charset" + ), } ) return args, options @@ -141,7 +148,9 @@ def get_mssql_args(self, config): if config.get("port"): server += f",{config.get('port')}" - trusted_connection = config.get("options").get("trusted_connection") == "Yes" + trusted_connection = ( + config.get("options").get("trusted_connection") == "Yes" + ) options = OrderedDict( { "-d": config.get("database"), @@ -177,7 +186,9 @@ def remove_empty_options(self, options): def get_sensitive_options(self, config): driver = config.get("full_details").get("driver") try: - sensitive_options = getattr(self, f"get_{driver}_sensitive_options")() + sensitive_options = getattr( + self, f"get_{driver}_sensitive_options" + )() except AttributeError: sensitive_options = [] return sensitive_options @@ -199,5 +210,7 @@ def hide_sensitive_options(self, config, command): if option in command: match = re.search(rf"{option} (\w+)", command) if match.groups(): - cleaned_command = cleaned_command.replace(match.groups()[0], "***") + cleaned_command = cleaned_command.replace( + match.groups()[0], "***" + ) return cleaned_command diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/__init__.py index 05784e73..4c3b116f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/commands/__init__.py @@ -3,15 +3,15 @@ sys.path.append(os.getcwd()) -from .DBMigrateCommand import DBMigrateCommand -from .DBSeedCommand import DBSeedCommand from .MakeMigrationCommand import MakeMigrationCommand from .MakeModelCommand import MakeModelCommand from .MakeObserverCommand import MakeObserverCommand from .MakeSeedCommand import MakeSeedCommand +from .DBMigrateCommand import DBMigrateCommand from .MigrateFreshCommand import MigrateFreshCommand from .MigrateRefreshCommand import MigrateRefreshCommand from .MigrateResetCommand import MigrateResetCommand from .MigrateRollbackCommand import MigrateRollbackCommand from .MigrateStatusCommand import MigrateStatusCommand +from .DBSeedCommand import DBSeedCommand from .ShellCommand import ShellCommand diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/config.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/config.py index c605d7fd..acb3819d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/config.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/config.py @@ -1,6 +1,5 @@ -from dataclasses import dataclass -from typing import Any, Dict, Optional - +from typing import Optional, Dict, Any +from pydantic.dataclasses import dataclass from fastapi_startkit.environment.environment import env @@ -11,7 +10,6 @@ class SQLiteConfig: database: str = env("DB_DATABASE", "database.sqlite") options: Optional[Dict[str, Any]] = None - @dataclass class MySQLConfig: driver: str = "mysql" @@ -36,6 +34,6 @@ class PostgresConfig: database: str = env("DB_DATABASE", "inertia") username: str = env("DB_USERNAME", "postgres") password: str = env("DB_PASSWORD", "") - charset: str = env("DB_CHARSET", "utf8") + charset: str = env('DB_CHARSET', 'utf8') sslmode: str = env("DB_SSLMODE", "prefer") options: Optional[Dict[str, Any]] = None diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/database.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/database.py index 5ad7c50f..9eec570e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/database.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/config/database.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field -from typing import Any, Dict +from typing import Dict, Any from fastapi_startkit.environment import env from fastapi_startkit.masoniteorm import SQLiteConfig @@ -9,16 +9,16 @@ class DatabaseConfig: default: str = field(default_factory=lambda: env("DB_CONNECTION", "pgsql")) - connections: Dict[str, Dict[str, Any]] = field( - default_factory=lambda: { - "sqlite": SQLiteConfig( - driver="sqlite", - database=env("DB_DATABASE", "database.sqlite"), - options=None, - ), - } - ) + connections: Dict[str, Dict[str, Any]] = field(default_factory=lambda: { + "sqlite": SQLiteConfig( + driver="sqlite", + database=env("DB_DATABASE", "database.sqlite"), + options=None, + ), + }) - migrations: Dict[str, Dict[str, Any]] = field( - default_factory=lambda: {"table": "migrations", "path": "databases/migrations"} - ) + migrations: Dict[str, Dict[str, Any]] = field(default_factory=lambda: { + "table": "migrations", + + "path": "databases/migrations" + }) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/connection.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/connection.py index 3826cf25..dd1696f8 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/connection.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/connection.py @@ -1,5 +1,7 @@ +from typing import Any + from sqlalchemy import text -from sqlalchemy.ext.asyncio import AsyncEngine +from sqlalchemy.ext.asyncio import AsyncConnection, AsyncEngine from fastapi_startkit.masoniteorm.models.builder import QueryBuilder @@ -9,8 +11,12 @@ def __init__(self, connection: AsyncEngine, config: dict): self.config = config self.conn: AsyncEngine = connection - def query(self) -> "QueryBuilder": - return QueryBuilder(connection=self, grammar=self.get_query_grammar(), processor=self.get_post_processor()) + def query(self) -> 'QueryBuilder': + return QueryBuilder( + connection=self, + grammar=self.get_query_grammar(), + processor=self.get_post_processor() + ) def get_query_grammar(cls): pass @@ -19,7 +25,7 @@ def get_post_processor(self): pass @classmethod - def on(cls, connection: str) -> "Connection": + def on(cls, connection: str) -> 'Connection': return cls(connection) async def begin_transaction(self) -> None: @@ -44,9 +50,9 @@ def sql_alchemy_bindings(self, query: str, bindings: list | None = None): params = {} if bindings: for i, val in enumerate(bindings): - name = f"p{i}" + name = f'p{i}' params[name] = val - query = query.replace("?", f":{name}", 1) + query = query.replace('?', f':{name}', 1) return (query, params) async def run(self, query: str, bindings: list | None = None): @@ -80,9 +86,9 @@ async def update(self, query: str, bindings: list | None = None) -> int: result = await conn.execute(text(query), params) await conn.commit() - return result.rowcount # type: ignore[return-value] + return result.rowcount # type: ignore[return-value] - async def delete(self, query: str, bindings: list | None = None) -> int: + async def delete(self, query: str, bindings: list | None = None) -> int: result = await self.run(query, bindings) return result.rowcount # type: ignore[return-value] diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py index 1d0ea2c5..77dd4de1 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/factory.py @@ -1,17 +1,17 @@ from typing import Any from sqlalchemy import StaticPool -from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine +from sqlalchemy.ext.asyncio import create_async_engine, AsyncEngine from fastapi_startkit.masoniteorm.connections.connection import Connection -from fastapi_startkit.masoniteorm.connections.postgres_connection import PostgresConnection from fastapi_startkit.masoniteorm.connections.sqlite_connection import SQliteConnection +from fastapi_startkit.masoniteorm.connections.postgres_connection import PostgresConnection class ConnectionFactory: DRIVER_URLS = { - "sqlite": "sqlite+aiosqlite", - "mysql": "mysql+aiomysql", + "sqlite": "sqlite+aiosqlite", + "mysql": "mysql+aiomysql", "postgres": "postgresql+asyncpg", } @@ -22,11 +22,11 @@ def build_url(cls, config: dict) -> str: driver = config["driver"] scheme = cls.DRIVER_URLS[driver] - user = config.get("username", "") - pwd = config.get("password", "") - host = config.get("host", "localhost") - port = config.get("port", "") - db = config.get("database", "") + user = config.get("username", "") + pwd = config.get("password", "") + host = config.get("host", "localhost") + port = config.get("port", "") + db = config.get("database", "") return f"{scheme}://{user}:{pwd}@{host}:{port}/{db}" @classmethod @@ -35,16 +35,15 @@ def create_engine(cls, cfg: dict) -> AsyncEngine: kwargs: dict[str, Any] = {"echo": True} if cfg["driver"] == "sqlite": kwargs["connect_args"] = {"check_same_thread": False} - kwargs["poolclass"] = StaticPool + kwargs["poolclass"] = StaticPool return create_async_engine(url, **kwargs) def make(self, config: dict, name: str) -> type[Connection]: engine = self.create_engine(config) - driver = config["driver"] + driver = config['driver'] match driver: - case "sqlite": - return SQliteConnection(engine, config) - case "postgres": - return PostgresConnection(engine, config) + case 'sqlite': return SQliteConnection(engine, config) + case 'postgres': return PostgresConnection(engine, config) raise ValueError(f"Unsupported driver: {driver}") + diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/manager.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/manager.py index c663b003..e523083b 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/manager.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/manager.py @@ -13,11 +13,7 @@ def __init__(self, factory: "ConnectionFactory", config: dict): def connection(self, name: str | None): name = self.get_default_connection_name(name) assert name is not None - connections = self.config.get("connections", {}) - if name not in connections: - raise ValueError(f"No connection name {name} found") - - config = connections[name] + config = self.config[name] if name not in self.connections: self.connections[name] = self.factory.make(config, name) @@ -36,5 +32,4 @@ def get_default_connection_name(self, name: str | None) -> str: def get_schema_builder(self): from fastapi_startkit.masoniteorm.schema import Schema - return Schema(self) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py index c53a6085..81433f34 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py @@ -1,9 +1,7 @@ from typing import Any - from fastapi_startkit.masoniteorm.query.grammars import PostgresGrammar from fastapi_startkit.masoniteorm.query.processors import PostgresPostProcessor from fastapi_startkit.masoniteorm.schema.platforms import PostgresPlatform - from .connection import Connection @@ -27,13 +25,12 @@ async def insert(self, query: str, bindings: list | None = None) -> Any: query, params = self.sql_alchemy_bindings(query, bindings) from sqlalchemy import text - async with self.conn.connect() as conn: result = await conn.execute(text(query), params) await conn.commit() - + row = result.fetchone() if row: return dict(zip(result.keys(), row)) - + return None diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py index 56b107ad..fc7c83e5 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py @@ -1,10 +1,8 @@ from fastapi_startkit.masoniteorm.query.grammars import SQLiteGrammar from fastapi_startkit.masoniteorm.query.processors import SQLitePostProcessor from fastapi_startkit.masoniteorm.schema.platforms import SQLitePlatform - from .connection import Connection - class SQliteConnection(Connection): @classmethod def get_query_grammar(cls): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/expressions/expressions.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/expressions/expressions.py index 4bef40c4..12b1f47c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/expressions/expressions.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/expressions/expressions.py @@ -168,7 +168,9 @@ def on_value(self, column, *args): def or_on_value(self, column, *args): equality, value = self._extract_operator_value(*args) - self.on_clauses += ((OnValueClause(column, equality, value, "value", operator="or")),) + self.on_clauses += ( + (OnValueClause(column, equality, value, "value", operator="or")), + ) return self def on_null(self, column): @@ -204,7 +206,9 @@ def or_on_null(self, column): Returns: self """ - self.on_clauses += ((OnValueClause(column, "=", None, "NULL", operator="or")),) + self.on_clauses += ( + (OnValueClause(column, "=", None, "NULL", operator="or")), + ) return self def or_on_not_null(self, column: str): @@ -216,10 +220,14 @@ def or_on_not_null(self, column: str): Returns: self """ - self.on_clauses += ((OnValueClause(column, "=", True, "NOT NULL", operator="or")),) + self.on_clauses += ( + (OnValueClause(column, "=", True, "NOT NULL", operator="or")), + ) return self - @deprecated("Using where() in a Join clause has been superceded by on_value()") + @deprecated( + "Using where() in a Join clause has been superceded by on_value()" + ) def where(self, column, *args): return self.on_value(column, *args) @@ -237,7 +245,10 @@ def _extract_operator_value(self, *args): value = args[0] if operator not in operators: - raise ValueError("Invalid comparison operator. The operator can be %s" % ", ".join(operators)) + raise ValueError( + "Invalid comparison operator. The operator can be %s" + % ", ".join(operators) + ) return operator, value diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/DB.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/DB.py index a987d7aa..4628f15c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/DB.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/DB.py @@ -15,8 +15,7 @@ class DB: def instance(cls) -> "DatabaseManager": if cls._instance is None: from fastapi_startkit.application import app - - cls._instance = app().make("db") + cls._instance = app().make('db') return cls._instance # type: ignore[return-value] @classmethod @@ -51,4 +50,4 @@ async def delete(cls, query: str, bindings: list | None = None) -> int: @classmethod async def statement(cls, query: str, bindings: list | None = None) -> bool: - return await cls.instance().connection(None).statement(query, bindings) + return await cls.instance().connection(None).statement(query, bindings) \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/Schema.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/Schema.py index 36cf47b5..f2cf31ad 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/Schema.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/facades/Schema.py @@ -3,8 +3,8 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from fastapi_startkit.masoniteorm.schema.Blueprint import Blueprint from fastapi_startkit.orm.schema.schema import Schema as SchemaBuilder + from fastapi_startkit.masoniteorm.schema.Blueprint import Blueprint class Schema: @@ -14,8 +14,7 @@ class Schema: def instance(cls) -> "SchemaBuilder": if cls._instance is None: from fastapi_startkit.application import app - - cls._instance = app().make("schema") + cls._instance = app().make('schema') return cls._instance # type: ignore[return-value] @classmethod @@ -52,4 +51,4 @@ async def drop_table_if_exists(cls, table: str) -> None: @classmethod async def rename(cls, table: str, new_name: str) -> None: - return await cls.instance().rename(table, new_name) + return await cls.instance().rename(table, new_name) \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/factory/factory.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/factory/factory.py index 03e22973..f76cb920 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/factory/factory.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/factory/factory.py @@ -1,129 +1,21 @@ -import inspect from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Callable, List, Optional, Self, Tuple, Union - -from faker import Faker +from typing import TYPE_CHECKING if TYPE_CHECKING: from fastapi_startkit.masoniteorm.models import Model -fake = Faker() - class Factory(ABC): - model: "Model" - fake: Faker = fake - _after_making: List[Callable] = [] - _after_creating: List[Callable] = [] - _states: List[Callable] = [] - _has: List[Tuple["Factory", Optional[str]]] = [] - _for: Optional["Factory"] = None - _count: Optional[int] = None - - def __init__(self): - self._after_making = [] - self._after_creating = [] - self._states = [] - self._has = [] - self._for = None - self._count = None + model: 'Model' @abstractmethod - def definition(self) -> dict: ... - - def configure(self) -> Self: - return self - - def count(self, n: int) -> Self: - self._count = n - return self - - def state(self, callback: Callable) -> Self: - self._states.append(callback) - return self - - def has(self, factory: "Factory", relationship: str = None) -> Self: - self._has.append((factory, relationship)) - return self - - def for_(self, factory: "Factory") -> Self: - self._for = factory - return self - - def after_making(self, callback: Callable) -> Self: - self._after_making.append(callback) - return self - - def after_creating(self, callback: Callable) -> Self: - self._after_creating.append(callback) - return self - - def _apply_states(self, attributes: dict) -> dict: - for state in self._states: - if callable(state): - if inspect.isfunction(state) or inspect.ismethod(state): - # Check if it takes attributes - sig = inspect.signature(state) - if len(sig.parameters) > 0: - attributes.update(state(attributes)) - else: - attributes.update(state()) - else: - attributes.update(state) - elif isinstance(state, dict): - attributes.update(state) - return attributes - - async def make(self, **overrides) -> Union["Model", List["Model"]]: - count = self._count or 1 - instances = [] - - for _ in range(count): - attributes = self.definition() - attributes = self._apply_states(attributes) - attributes.update(overrides) - - instance = self.model(attributes) - - for callback in self._after_making: - await callback(instance) - - instances.append(instance) - - return instances if self._count is not None else instances[0] - - async def create(self, **overrides) -> Union["Model", List["Model"]]: - count = self._count or 1 - results = [] - - for _ in range(count): - attributes = self.definition() - attributes = self._apply_states(attributes) - attributes.update(overrides) - - # Handle 'for' relationship - if self._for: - parent = await self._for.create() - # Naive FK: parent_table_singular_id - foreign_key = f"{parent.__table__[:-1]}_id" - attributes[foreign_key] = parent.id - - result = await self.model.create(attributes) - - # Handle 'has' relationships - for factory, relationship in self._has: - # Naive FK: current_table_singular_id - foreign_key = f"{self.model.__table__[:-1]}_id" - await factory.create(**{foreign_key: result.id}) - - for callback in self._after_creating: - await callback(result) - - results.append(result) - - return results if self._count is not None else results[0] + def definition(self)->dict: + ... @classmethod - def new(cls) -> Self: + async def create(cls) -> 'Model': + model: Model = cls.model instance = cls() - return instance.configure() + + result = await model.create(instance.definition()) + return result diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/helpers/misc.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/helpers/misc.py index 72d71354..2b26830e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/helpers/misc.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/helpers/misc.py @@ -9,7 +9,9 @@ def deprecated(message): def deprecated_decorator(func): def deprecated_func(*args, **kwargs): warnings.warn( - "{} is a deprecated function. {}".format(func.__name__, message), + "{} is a deprecated function. {}".format( + func.__name__, message + ), category=DeprecationWarning, stacklevel=2, ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/migrations/Migration.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/migrations/Migration.py index 57f30a1d..3c6f643f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/migrations/Migration.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/migrations/Migration.py @@ -13,10 +13,10 @@ class Migration: db_manager: "DatabaseManager" def __init__( - self, - connection="default", - command_class=None, - migration_directory="databases/migrations", + self, + connection="default", + command_class=None, + migration_directory="databases/migrations", ): self.connection = connection self.migration_directory = migration_directory @@ -38,7 +38,9 @@ async def get_unran_migrations(self): all_migrations = [ f.replace(".py", "") for f in listdir(directory_path) - if isfile(join(directory_path, f)) and f != "__init__.py" and not f.startswith(".") + if isfile(join(directory_path, f)) + and f != "__init__.py" + and not f.startswith(".") ] all_migrations.sort() unran_migrations = [] @@ -51,14 +53,18 @@ async def get_unran_migrations(self): async def get_rollback_migrations(self): all_migrations = await self.migration_model.all() return ( - await self.migration_model.where("batch", all_migrations.max("batch")) + await self.migration_model.where( + "batch", all_migrations.max("batch") + ) .order_by("migration_id", "desc") .get() ).pluck("migration") async def get_all_migrations(self, reverse=False): if reverse: - return (await self.migration_model.order_by("migration_id", "desc").get()).pluck("migration") + return ( + await self.migration_model.order_by("migration_id", "desc").get() + ).pluck("migration") return (await self.migration_model.all()).pluck("migration") @@ -69,9 +75,13 @@ async def delete_migration(self, file_path): return await self.migration_model.where("migration", file_path).delete() def locate(self, file_name): - migration_name = camelize("_".join(file_name.split("_")[4:]).replace(".py", "")) + migration_name = camelize( + "_".join(file_name.split("_")[4:]).replace(".py", "") + ) file_name = file_name.replace(".py", "") - migration_directory = self.migration_directory.replace("/", ".").replace("\\", ".") + migration_directory = self.migration_directory.replace( + "/", "." + ).replace("\\", ".") return locate(f"{migration_directory}.{file_name}.{migration_name}") async def get_ran_migrations(self): @@ -79,14 +89,18 @@ async def get_ran_migrations(self): all_migrations = [ f.replace(".py", "") for f in listdir(directory_path) - if isfile(join(directory_path, f)) and f != "__init__.py" and not f.startswith(".") + if isfile(join(directory_path, f)) + and f != "__init__.py" + and not f.startswith(".") ] all_migrations.sort() ran = [] database_migrations = await self.migration_model.all() for migration in all_migrations: - matched_migration = database_migrations.where("migration", migration).first() + matched_migration = database_migrations.where( + "migration", migration + ).first() if matched_migration: ran.append( { @@ -110,14 +124,20 @@ async def migrate(self, migration="all", output=False): if migration_class is None: if self.command_class: - self.command_class.line(f"Not Found: {migration}") + self.command_class.line( + f"Not Found: {migration}" + ) continue self.last_migrations_ran.append(migration) if self.command_class: - self.command_class.line(f"Migrating: {migration}") + self.command_class.line( + f"Migrating: {migration}" + ) - migration_class = migration_class(connection=self.connection) + migration_class = migration_class( + connection=self.connection + ) if output: migration_class.schema.dry() @@ -139,9 +159,13 @@ async def migrate(self, migration="all", output=False): print(migration_class.schema._blueprint.to_sql()) if self.command_class: - self.command_class.line(f"Migrated: {migration} ({duration}s)") + self.command_class.line( + f"Migrated: {migration} ({duration}s)" + ) - await self.migration_model.create({"batch": batch, "migration": migration.replace(".py", "")}) + await self.migration_model.create( + {"batch": batch, "migration": migration.replace(".py", "")} + ) async def rollback(self, migration="all", output=False): default_migrations = await self.get_rollback_migrations() @@ -152,15 +176,21 @@ async def rollback(self, migration="all", output=False): migration = migration.replace(".py", "") if self.command_class: - self.command_class.line(f"Rolling back: {migration}") + self.command_class.line( + f"Rolling back: {migration}" + ) try: migration_class = self.locate(migration) except TypeError: - self.command_class.line(f"Not Found: {migration}") + self.command_class.line( + f"Not Found: {migration}" + ) continue - migration_class = migration_class(connection=self.connection, schema=self.schema_name) + migration_class = migration_class( + connection=self.connection, schema=self.schema_name + ) if output: migration_class.schema.dry() @@ -173,7 +203,10 @@ async def rollback(self, migration="all", output=False): if self.command_class: table = self.command_class.table() table.set_header_row(["SQL"]) - if hasattr(migration_class.schema, "_blueprint") and migration_class.schema._blueprint: + if ( + hasattr(migration_class.schema, "_blueprint") + and migration_class.schema._blueprint + ): sql = migration_class.schema._blueprint.to_sql() if isinstance(sql, list): sql = ",".join(sql) @@ -189,13 +222,19 @@ async def rollback(self, migration="all", output=False): await self.delete_migration(migration) if self.command_class: - self.command_class.line(f"Rolled back: {migration} ({duration}s)") + self.command_class.line( + f"Rolled back: {migration} ({duration}s)" + ) async def delete_migrations(self, migrations=None): - return await self.migration_model.where_in("migration", migrations or []).delete() + return await self.migration_model.where_in( + "migration", migrations or [] + ).delete() async def delete_last_batch(self): - return await self.migration_model.where("batch", await self.get_last_batch_number()).delete() + return await self.migration_model.where( + "batch", await self.get_last_batch_number() + ).delete() async def reset(self, migration="all"): default_migrations = await self.get_all_migrations(reverse=True) @@ -209,13 +248,19 @@ async def reset(self, migration="all"): for migration in migrations: if self.command_class: - self.command_class.line(f"Rolling back: {migration}") + self.command_class.line( + f"Rolling back: {migration}" + ) try: - migration_instance = self.locate(migration)(connection=self.connection, schema=self.schema_name) + migration_instance = self.locate(migration)( + connection=self.connection, schema=self.schema_name + ) await migration_instance.down() except TypeError: - self.command_class.line(f"Not Found: {migration}") + self.command_class.line( + f"Not Found: {migration}" + ) continue # raise MigrationNotFound(f"Could not find {migration}") @@ -223,7 +268,9 @@ async def reset(self, migration="all"): await self.delete_migration(migration) if self.command_class: - self.command_class.line(f"Rolled back: {migration}") + self.command_class.line( + f"Rolled back: {migration}" + ) await self.delete_migrations([migration]) @@ -256,7 +303,9 @@ async def fresh(self, ignore_fk=False, migration="all"): if not await self.get_unran_migrations(): if self.command_class: - self.command_class.line("Nothing to migrate") + self.command_class.line( + "Nothing to migrate" + ) return await self.migrate(migration) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/MigrationModel.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/MigrationModel.py index a13e62e6..c01bbf69 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/MigrationModel.py @@ -1,6 +1,5 @@ from fastapi_startkit.masoniteorm.models import Model - class MigrationModel(Model): __table__ = "migrations" __timestamps__ = False diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/__init__.py index a18664ef..7c7cf005 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/__init__.py @@ -1,3 +1,3 @@ -from .caster import Caster from .model import Model +from .caster import Caster from .registry import Registry diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/attribute.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/attribute.py index 27a81a7a..92355973 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/attribute.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/attribute.py @@ -5,7 +5,6 @@ if TYPE_CHECKING: from fastapi_startkit.orm.connections.manager import Model - class Attribute: # Attributes that are model infrastructure, not data columns. # Assignments to these bypass set_attribute() and go straight to __dict__. @@ -16,7 +15,7 @@ class Attribute: caster: Caster = None def __init__(self, attributes: dict = None, **kwargs): - model: "Model" = self.__class__ + model: 'Model' = self.__class__ self.caster = Caster(model) self._original = {} @@ -29,7 +28,11 @@ def __init__(self, attributes: dict = None, **kwargs): def __setattr__(self, key: str, value): # Before _dirty_attributes is initialised (early __init__), or for # internal/meta attributes, fall back to normal object assignment. - if key.startswith("_") or key in self._META_ATTRIBUTES or "_dirty_attributes" not in self.__dict__: + if ( + key.startswith("_") + or key in self._META_ATTRIBUTES + or "_dirty_attributes" not in self.__dict__ + ): super().__setattr__(key, value) else: self.set_attribute(key, value) @@ -91,7 +94,14 @@ def is_dirty(self) -> bool: return bool(self.get_dirty()) def get_dirty(self) -> dict: - return {key: value for key, value in self.get_attributes().items() if not self.original_is_equivalent(key)} + return { + key: value + for key, value in self.get_attributes().items() + if not self.original_is_equivalent(key) + } def get_attributes_for_insert(self) -> dict: return {**self._attributes, **self._dirty_attributes} + + + diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/builder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/builder.py index 3e700dc9..19d16197 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/builder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/builder.py @@ -1,13 +1,14 @@ import inspect + +import inflection from typing import TYPE_CHECKING from fastapi_startkit.masoniteorm.expressions.expressions import ( - AggregateExpression, QueryExpression, SelectExpression, - SubGroupExpression, - SubSelectExpression, UpdateQueryExpression, + SubSelectExpression, + SubGroupExpression, ) from fastapi_startkit.masoniteorm.query.EagerLoadMixin import EagerLoadMixin from fastapi_startkit.masoniteorm.query.support import SupportMixin @@ -17,7 +18,7 @@ class QueryBuilder(EagerLoadMixin, SupportMixin): - def __init__(self, connection: "Connection", grammar, processor): + def __init__(self, connection: 'Connection', grammar, processor): super().__init__() self.connection = connection self.grammar = grammar @@ -26,9 +27,7 @@ def __init__(self, connection: "Connection", grammar, processor): self._columns = [] self._table = "" self._limit = False - self._offset = False self._wheres = [] - self._aggregates = [] self._sql = "" self._bindings = () @@ -36,42 +35,33 @@ def __init__(self, connection: "Connection", grammar, processor): self._global_scopes = {} self._action = "select" - def set_action(self, action: str) -> "QueryBuilder": + def set_action(self, action: str) -> 'QueryBuilder': self._action = action return self - def set_model(self, model) -> "QueryBuilder": + def set_model(self, model) -> 'QueryBuilder': self._model = model self._table = model.get_table_name() self._global_scopes = model._global_scopes return self - def with_(self, *eagers) -> "QueryBuilder": + def with_(self, *eagers) -> 'QueryBuilder': self._eager_relation.register(eagers) return self def get_table_name(self) -> str: return self._table - def when(self, condition, callback) -> "QueryBuilder": - """Conditionally apply a query constraint. - - If *condition* is truthy the *callback* is called with this builder - and its return value (also a QueryBuilder) is used to continue the - chain. If falsy the builder is returned unchanged. - """ - if condition: - return callback(self) - return self - - def where_in(self, column: str, values) -> "QueryBuilder": - if hasattr(values, "_items"): + def where_in(self, column: str, values) -> 'QueryBuilder': + if hasattr(values, '_items'): values = values._items values = list(values) if not isinstance(values, list) else values - self._wheres.append(QueryExpression(column, "IN", values)) + self._wheres.append( + QueryExpression(column, "IN", values) + ) return self - def select(self, *args) -> "QueryBuilder": + def select(self, *args) -> 'QueryBuilder': for arg in args: if isinstance(arg, list): for column in arg: @@ -81,48 +71,16 @@ def select(self, *args) -> "QueryBuilder": self._columns += (SelectExpression(column),) return self - def limit(self, limit: int) -> "QueryBuilder": + def limit(self, limit: int) -> 'QueryBuilder': self._limit = limit return self - def offset(self, offset: int) -> "QueryBuilder": - self._offset = offset - return self - - async def count(self) -> int: - self._aggregates = [AggregateExpression("COUNT", "*")] - self._columns = [] - results = await self.connection.select(self.to_qmark(), self.get_bindings()) - self._aggregates = [] - if results: - row = results[0] - return list(row.values())[0] - return 0 - - async def paginate(self, page: int = 1, per_page: int = 15): - from fastapi_startkit.masoniteorm.pagination.LengthAwarePaginator import LengthAwarePaginator - - # Save state before count modifies it - saved_columns = self._columns[:] - saved_limit = self._limit - saved_offset = self._offset - saved_bindings = self._bindings - - total = await self.count() - - # Restore state for the actual data query - self._columns = saved_columns - self._limit = saved_limit - self._offset = saved_offset - self._bindings = saved_bindings - - offset = (page - 1) * per_page - results = await self.limit(per_page).offset(offset).get() - - return LengthAwarePaginator(results, per_page, page, total) - - async def find(self, primary_key: str | int, columns=None): - return await self.where(self._model.__primary_key__, primary_key).first(columns) + async def find(self, primary_key: str|int, columns=None): + return ( + await self + .where(self._model.primary_key, primary_key) + .first(columns) + ) async def first(self, columns=None): if not columns: @@ -142,7 +100,11 @@ async def get_models(self, columns=None): models = await self.connection.select(self.to_qmark(), self.get_bindings()) collection = self._model.hydrate(models) - if self._eager_relation.eagers or self._eager_relation.nested_eagers or self._eager_relation.callback_eagers: + if ( + self._eager_relation.eagers + or self._eager_relation.nested_eagers + or self._eager_relation.callback_eagers + ): await self._load_eagers(collection, self._model) return collection @@ -150,7 +112,7 @@ async def get_models(self, columns=None): def get_bindings(self) -> tuple: return self._bindings - def run_scopes(self) -> "QueryBuilder": + def run_scopes(self) -> 'QueryBuilder': for name, scope in self._global_scopes.get(self._action, {}).items(): scope(self) return self @@ -160,9 +122,7 @@ def get_grammar(self): columns=self._columns, table=self._table, limit=self._limit, - offset=self._offset, wheres=self._wheres, - aggregates=self._aggregates, ) def to_qmark(self) -> str: @@ -229,18 +189,22 @@ def where(self, column, *args): if inspect.isfunction(column): builder = column(self.new()) - self._wheres += ((QueryExpression(None, operator, SubGroupExpression(builder))),) + self._wheres += ( + (QueryExpression(None, operator, SubGroupExpression(builder))), + ) elif isinstance(column, dict): for key, value in column.items(): self._wheres += ((QueryExpression(key, "=", value, "value")),) elif isinstance(value, QueryBuilder): - self._wheres += ((QueryExpression(column, operator, SubSelectExpression(value))),) + self._wheres += ( + ( + QueryExpression( + column, operator, SubSelectExpression(value) + ) + ), + ) else: - self._wheres += ((QueryExpression(column, operator, value, "value")),) - return self - - def or_where(self, column, *args): - """Specifies an OR where expression.""" - operator, value = self._extract_operator_value(*args) - self._wheres += ((QueryExpression(column, operator, value, "value", keyword="or")),) + self._wheres += ( + (QueryExpression(column, operator, value, "value")), + ) return self diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/caster.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/caster.py index 91c53b88..8208f5ee 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/caster.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/caster.py @@ -1,23 +1,19 @@ -import datetime import json -from dataclasses import dataclass, field +import pendulum +import datetime from decimal import Decimal from enum import Enum -from typing import TYPE_CHECKING, Any, Optional, get_type_hints - -import pendulum +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, Any, get_type_hints, Optional from pydantic.fields import FieldInfo - from fastapi_startkit.carbon import Carbon if TYPE_CHECKING: from .model import Model - @dataclass class BaseCast: """Base class for all casters""" - config: Optional[FieldInfo] = field(default=None, kw_only=True) def get(self, value): @@ -125,9 +121,12 @@ class Caster: "decimal": DecimalCast, } - IGNORE_CASTS = ["caster", "db_manager"] + IGNORE_CASTS = [ + 'caster', + 'db_manager' + ] - def __init__(self, model: "Model", casts: dict | None = None): + def __init__(self, model: 'Model', casts: dict|None=None): self.model = model self.casts = Caster.build_casts(model) self.casts.update(casts or {}) @@ -135,23 +134,24 @@ def __init__(self, model: "Model", casts: dict | None = None): @classmethod def build_casts(cls, model): model = model if isinstance(model, type) else model.__class__ + from .registry import Registry from fastapi_startkit.masoniteorm.relationships.BaseRelationship import BaseRelationship - try: annotations = get_type_hints(model) except NameError: annotations = {} for klass in reversed(model.__mro__): - for name, hint in vars(klass).get("__annotations__", {}).items(): + for name, hint in vars(klass).get('__annotations__', {}).items(): if not isinstance(getattr(model, name, None), BaseRelationship): annotations[name] = hint annotations = { - k: v for k, v in annotations.items() if not isinstance(getattr(model, k, None), BaseRelationship) + k: v for k, v in annotations.items() + if not isinstance(getattr(model, k, None), BaseRelationship) } # Ignore the builder - annotations = {k: v for k, v in annotations.items() if k not in cls.IGNORE_CASTS} + annotations = {k:v for k, v in annotations.items() if k not in cls.IGNORE_CASTS} from .fields import FieldDescriptor # 1. Collect all potential fields (annotations + descriptors) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/fields.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/fields.py index 13c30d09..5f9e3663 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/fields.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/fields.py @@ -1,7 +1,7 @@ -from typing import Any - -from pydantic import Field as BaseField +import pendulum from pydantic.fields import FieldInfo +from pydantic import Field as BaseField +from typing import Any from fastapi_startkit.masoniteorm.models.observer import CreatedAtObserver, UpdatedAtObserver @@ -11,7 +11,6 @@ class FieldDescriptor: A descriptor that wraps Pydantic's FieldInfo. It allows us to store metadata that the Caster can later discover. """ - def __init__(self, field_info: FieldInfo): self.field_info = field_info self.name = None @@ -31,14 +30,12 @@ def __set__(self, instance, value): # When setting (e.g., user.name = 'Joe'), update ORM storage instance.set_value(self.name, value) - def Field(*args, **kwargs) -> Any: """ Factory function that returns a FieldDescriptor wrapping a Pydantic Field. """ return FieldDescriptor(BaseField(*args, **kwargs)) - class DateTimeField: def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"): self.format = fmt @@ -56,7 +53,6 @@ def __get__(self, instance, owner): # def __set__(self, instance, value): # instance.set_attribute(self.name, value) - class CreatedAtField: def __init__(self, fmt: str = "YYYY-MM-DD HH:mm:ss", tz: str = "UTC"): self.format = fmt diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py index 3b0be5ef..89a5bd4e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/model.py @@ -1,24 +1,23 @@ from __future__ import annotations +import inflection from typing import TYPE_CHECKING -import inflection - from fastapi_startkit.carbon import Carbon from fastapi_startkit.masoniteorm.collection import Collection -from fastapi_startkit.masoniteorm.connections.manager import DatabaseManager -from fastapi_startkit.masoniteorm.models.attribute import Attribute from fastapi_startkit.masoniteorm.models.fields import CreatedAtField, UpdatedAtField from fastapi_startkit.masoniteorm.models.registry import Registry -from fastapi_startkit.masoniteorm.models.relationship import Relationship from fastapi_startkit.masoniteorm.observers import ObservesEvents +from fastapi_startkit.masoniteorm.connections.manager import DatabaseManager +from fastapi_startkit.masoniteorm.models.attribute import Attribute +from fastapi_startkit.masoniteorm.models.relationship import Relationship if TYPE_CHECKING: from fastapi_startkit.orm.models.builder import QueryBuilder class Model(Attribute, Relationship, ObservesEvents): - db_manager: "DatabaseManager" = None + db_manager: 'DatabaseManager' = None __table__ = None __primary_key__ = "id" __timestamps__ = True @@ -28,6 +27,7 @@ class Model(Attribute, Relationship, ObservesEvents): __fillable__: list[str] = [] + def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) Registry.register(cls) @@ -36,7 +36,6 @@ def __init_subclass__(cls, **kwargs): for name, _typ in cls.__annotations__.items(): attr = getattr(cls, name, None) from fastapi_startkit.masoniteorm.relationships.BaseRelationship import BaseRelationship - if isinstance(attr, BaseRelationship): continue if callable(attr): @@ -49,7 +48,7 @@ def __init_subclass__(cls, **kwargs): def __init__(self, attributes: dict = None, **kwargs): super().__init__(attributes, **kwargs) - self.connection = "default" + self.connection = 'default' self._global_scopes = {} self.__with__ = {} self._exists = False @@ -78,11 +77,11 @@ def get_related(self, key: str): return getattr(self.__class__, key) @classmethod - def with_(cls, *eagers) -> "QueryBuilder": + def with_(cls, *eagers) -> 'QueryBuilder': return cls.query().with_(*eagers) @classmethod - async def find(cls, primary_key: str | int, columns=None): + async def find(cls, primary_key: str|int, columns=None): return await cls.query().find(primary_key, columns) @classmethod @@ -152,7 +151,7 @@ def query(cls): return cls().new_query() @classmethod - async def first_or_create(cls, search: dict, attributes: dict | None = None) -> "Model": + async def first_or_create(cls, search: dict, attributes: dict | None = None) -> 'Model': return await cls.query().first_or_create(search, attributes) @classmethod @@ -168,7 +167,7 @@ async def update(self, attributes: dict) -> bool: return await self.fill(attributes).save() - def fill(self, attributes: dict) -> "Model": + def fill(self, attributes: dict) -> 'Model': for key, value in attributes.items(): if key in self.__fillable__: self.set_attribute(key, value) @@ -200,8 +199,6 @@ async def perform_insert(self, query) -> bool: # Store the auto-generated primary key so subsequent saves do an UPDATE if inserted_id is not None: - if isinstance(inserted_id, dict): - inserted_id = inserted_id.get(self.__primary_key__) self._dirty_attributes[self.__primary_key__] = inserted_id self._exists = True diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/observer.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/observer.py index f7bd5e52..0ce5a7ca 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/observer.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/observer.py @@ -1,5 +1,4 @@ import pendulum - from fastapi_startkit.masoniteorm.expressions.expressions import UpdateQueryExpression @@ -26,4 +25,6 @@ def creating(self, model): def updating(self, model): if model.__timestamps__: - model.builder._updates += (UpdateQueryExpression({self.field_name: pendulum.now(self.tz)}),) + model.builder._updates += ( + UpdateQueryExpression({self.field_name: pendulum.now(self.tz)}), + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/relationship.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/relationship.py index fca0e877..b358f90c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/relationship.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/models/relationship.py @@ -1,3 +1,5 @@ +from fastapi_startkit.masoniteorm.query.EagerRelation import EagerRelations + class Relationship: __relationship_hidden__ = {} __with__ = () diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py index 11bf88fc..401c14a7 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py @@ -1,6 +1,6 @@ class ObservesEvents: def observe_events(self, model, event): - if model.__has_events__: + if model.__has_events__ == True: for klass in type(model).__mro__: for observer in model.__observers__.get(klass, []): try: diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py index ea769c40..34bb6e20 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py @@ -10,7 +10,9 @@ def __init__(self, result, per_page, current_page, total, url=None): self.per_page = per_page self.count = len(self.result) self.last_page = int(math.ceil(total / per_page)) - self.next_page = (int(self.current_page) + 1) if self.has_more_pages() else None + self.next_page = ( + (int(self.current_page) + 1) if self.has_more_pages() else None + ) self.previous_page = (int(self.current_page) - 1) or None self.total = total self.url = url diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py index cf1b9a83..e5542e66 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py @@ -7,7 +7,9 @@ def __init__(self, result, per_page, current_page, url=None): self.current_page = current_page self.per_page = per_page self.count = len(self.result) - self.next_page = (int(self.current_page) + 1) if self.has_more_pages() else None + self.next_page = ( + (int(self.current_page) + 1) if self.has_more_pages() else None + ) self.previous_page = (int(self.current_page) - 1) or None self.url = url diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py index b026b35a..7c779642 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py @@ -1,14 +1,14 @@ from pathlib import Path from fastapi_startkit.masoniteorm.commands import ( - DBMigrateCommand, DBSeedCommand, MakeMigrationCommand, MakeModelCommand, MakeSeedCommand, - MigrateFreshCommand, - MigrateRollbackCommand, + DBMigrateCommand, MigrateStatusCommand, + MigrateRollbackCommand, + MigrateFreshCommand ) from fastapi_startkit.masoniteorm.connections.factory import ConnectionFactory from fastapi_startkit.masoniteorm.connections.manager import DatabaseManager @@ -20,30 +20,29 @@ class DatabaseProvider(Provider): def register(self): from ..config.database import DatabaseConfig - - config = self.resolve_config(DatabaseConfig) + config =self.resolve_config(DatabaseConfig) self.merge_config_from(config, self.provider_key) db = DatabaseManager(ConnectionFactory(), config) - self.app.bind("db", db) - self.app.bind("schema", db.get_schema_builder()) + self.app.bind('db', db) + self.app.bind('schema', db.get_schema_builder()) Model.db_manager = db Migration.db_manager = db def boot(self) -> None: - self.publishes({Path(__file__).resolve().parent.parent.joinpath("config/database.py"): "config/database.py"}) - - self.commands( - [ - DBMigrateCommand, - DBSeedCommand, - MakeMigrationCommand, - MigrateStatusCommand, - MigrateRollbackCommand, - MakeModelCommand, - MakeSeedCommand, - MigrateFreshCommand, - ] - ) + self.publishes({ + Path(__file__).resolve().parent.parent.joinpath('config/database.py'): 'config/database.py' + }) + + self.commands([ + DBMigrateCommand, + DBSeedCommand, + MakeMigrationCommand, + MigrateStatusCommand, + MigrateRollbackCommand, + MakeModelCommand, + MakeSeedCommand, + MigrateFreshCommand + ]) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/__init__.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/__init__.py index 9dfd5c2e..c61e54c9 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/providers/__init__.py @@ -1 +1 @@ -from .DatabaseProvider import DatabaseProvider +from .DatabaseProvider import DatabaseProvider \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/EagerRelation.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/EagerRelation.py index 5675da1c..3597e0fc 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/EagerRelation.py @@ -14,7 +14,9 @@ def register(self, *relations, callback=None): self.is_nested = True relation_key = relation.split(".")[0] if relation_key not in self.nested_eagers: - self.nested_eagers = {relation_key: relation.split(".")[1:]} + self.nested_eagers = { + relation_key: relation.split(".")[1:] + } else: self.nested_eagers[relation_key] += relation.split(".")[1:] elif isinstance(relation, (tuple, list)): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py index 48f44b3d..8cc71cb3 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py @@ -153,7 +153,9 @@ def _compile_insert(self, qmark=False): self._sql = self.insert_format().format( key_equals=self._compile_key_value_equals(qmark=qmark), table=self.process_table(self.table), - columns=self.process_columns(separator=", ", action="insert", qmark=qmark), + columns=self.process_columns( + separator=", ", action="insert", qmark=qmark + ), values=self.process_values(separator=", ", qmark=qmark), ) @@ -176,7 +178,10 @@ def _compile_bulk_create(self, qmark=False): return self def columnize_bulk_columns(self, columns=[]): - return ", ".join(self.column_string().format(column=x, separator="") for x in columns).rstrip(",") + return ", ".join( + self.column_string().format(column=x, separator="") + for x in columns + ).rstrip(",") def columnize_bulk_values(self, columns=[], qmark=False): sql = "" @@ -186,14 +191,28 @@ def columnize_bulk_values(self, columns=[], qmark=False): for y in x: if qmark: self.add_binding(y) - inner += "?, " if qmark else self.value_string().format(value=y, separator=", ") + inner += ( + "?, " + if qmark + else self.value_string().format( + value=y, separator=", " + ) + ) inner = inner.rstrip(", ") - sql += self.process_value_string().format(value=inner, separator=", ") + sql += self.process_value_string().format( + value=inner, separator=", " + ) else: if qmark: self.add_binding(x) - sql += "?, " if qmark else self.process_value_string().format(value="?" if qmark else x, separator=", ") + sql += ( + "?, " + if qmark + else self.process_value_string().format( + value="?" if qmark else x, separator=", " + ) + ) return sql.rstrip(", ") @@ -266,13 +285,15 @@ def process_joins(self, qmark=False): self.add_binding(clause.value) else: value = self._compile_value(clause.value) - on_string += ( - f"{keyword} {self._table_column_string(clause.column)} {clause.equality} {value} " - ) + on_string += f"{keyword} {self._table_column_string(clause.column)} {clause.equality} {value} " sql += self.join_string().format( foreign_table=self.process_table(join.table), - alias=(f" AS {self.process_table(join.alias)}" if join.alias else ""), + alias=( + f" AS {self.process_table(join.alias)}" + if join.alias + else "" + ), on=on_string, keyword=self.join_keywords[join.clause], ) @@ -312,7 +333,13 @@ def _compile_key_value_equals(self, qmark=False): else: sql += sql_string.format( column=self._table_column_string(key), - value=(self.value_string().format(value=value, separator="") if not qmark else "?"), + value=( + self.value_string().format( + value=value, separator="" + ) + if not qmark + else "?" + ), separator=", ", ) @@ -321,7 +348,11 @@ def _compile_key_value_equals(self, qmark=False): else: sql += sql_string.format( column=self._table_column_string(column), - value=(self.value_string().format(value=value, separator=", ") if not qmark else "?"), + value=( + self.value_string().format(value=value, separator=", ") + if not qmark + else "?" + ), separator=", ", ) if qmark: @@ -349,7 +380,11 @@ def process_aggregates(self): sql += ( aggregate_string.format( aggregate_function=aggregate_function, - column=("*" if column == "*" else self._table_column_string(column)), + column=( + "*" + if column == "*" + else self._table_column_string(column) + ), alias=self.process_alias(aggregates.alias or column), ) + ", " @@ -370,7 +405,9 @@ def process_order_by(self): if order_bys.raw: order_crit += order_bys.column if not isinstance(order_bys.bindings, (list, tuple)): - raise ValueError(f"Bindings must be tuple or list. Received {type(order_bys.bindings)}") + raise ValueError( + f"Bindings must be tuple or list. Received {type(order_bys.bindings)}" + ) if order_bys.bindings: self.add_binding(*order_bys.bindings) @@ -384,8 +421,12 @@ def process_order_by(self): if "." in column: column_string = self._table_column_string(column) else: - column_string = self.column_string().format(column=column, separator="") - order_crit += self.order_by_format().format(column=column_string, direction=direction.upper()) + column_string = self.column_string().format( + column=column, separator="" + ) + order_crit += self.order_by_format().format( + column=column_string, direction=direction.upper() + ) sql += self.order_by_string().format(order_columns=order_crit) return sql @@ -479,7 +520,9 @@ def process_offset(self): if not self._offset: return "" - return self.offset_string().format(offset=self._offset, limit=self._limit or 1) + return self.offset_string().format( + offset=self._offset, limit=self._limit or 1 + ) def process_locks(self): return self.locks.get(self.lock, "") @@ -506,7 +549,11 @@ def process_having(self, qmark=False): sql_string = self.having_equality_string() sql += sql_string.format( - column=(self._table_column_string(column) if raw is False else column), + column=( + self._table_column_string(column) + if raw is False + else column + ), equality=equality, value=self._compile_value(value), ) @@ -555,10 +602,14 @@ def process_wheres(self, query=None, qmark=False, strip_first_where=False): """If we have a raw query we just want to use the query supplied and don't need to compile anything. """ - sql += self.raw_query_string().format(keyword=keyword, query=where.column) + sql += self.raw_query_string().format( + keyword=keyword, query=where.column + ) if not isinstance(where.bindings, (list, tuple)): - raise ValueError(f"Bindings must be tuple or list. Received {type(where.bindings)}") + raise ValueError( + f"Bindings must be tuple or list. Received {type(where.bindings)}" + ) if where.bindings: self.add_binding(*where.bindings) @@ -603,7 +654,9 @@ def process_wheres(self, query=None, qmark=False, strip_first_where=False): keyword=keyword, ) elif value_type == "value_equals": - sql_string = self.value_equal_string().format(value1=where.column, value2=where.value, keyword=keyword) + sql_string = self.value_equal_string().format( + value1=where.column, value2=where.value, keyword=keyword + ) elif value_type == "NULL": sql_string = self.where_null_string() elif value_type == "DATE": @@ -631,7 +684,11 @@ def process_wheres(self, query=None, qmark=False, strip_first_where=False): grammar = value.builder.get_grammar() query_value = ( self.subquery_string() - .format(query=grammar.process_wheres(qmark=qmark, strip_first_where=True)) + .format( + query=grammar.process_wheres( + qmark=qmark, strip_first_where=True + ) + ) .replace("( ", "(") ) if grammar._bindings: @@ -644,7 +701,9 @@ def process_wheres(self, query=None, qmark=False, strip_first_where=False): self.add_binding(*value.builder._bindings) else: query_from_builder = value.builder.to_sql() - query_value = self.subquery_string().format(query=query_from_builder) + query_value = self.subquery_string().format( + query=query_from_builder + ) elif isinstance(value, list): query_value = "(" for val in value: @@ -652,7 +711,9 @@ def process_wheres(self, query=None, qmark=False, strip_first_where=False): query_value += "?, " self.add_binding(val) else: - query_value += self.value_string().format(value=val, separator=",") + query_value += self.value_string().format( + value=val, separator="," + ) query_value = query_value.rstrip(",").rstrip(", ") + ")" elif value is True and value_type != "NOT NULL": sql_string = self.get_true_column_string() @@ -673,15 +734,23 @@ def process_wheres(self, query=None, qmark=False, strip_first_where=False): if qmark: query_value = "?" else: - query_value = self.value_string().format(value=value, separator="") + query_value = self.value_string().format( + value=value, separator="" + ) self.add_binding(value) elif value_type == "column": - query_value = self._table_column_string(column=value, separator="") + query_value = self._table_column_string( + column=value, separator="" + ) elif value_type == "DATE": - query_value = self.value_string().format(value=value, separator="") + query_value = self.value_string().format( + value=value, separator="" + ) elif value_type == "having": - query_value = self._table_column_string(column=value, separator="") + query_value = self._table_column_string( + column=value, separator="" + ) else: query_value = "" @@ -798,7 +867,9 @@ def process_columns(self, separator="", action="select", qmark=False): sql += f"({builder_sql}) AS {column.alias}, " continue - sql += self._table_column_string(column, alias=alias, separator=separator) + sql += self._table_column_string( + column, alias=alias, separator=separator + ) if self._aggregates: sql += self.process_aggregates() @@ -857,7 +928,9 @@ def process_column(self, column, separator=""): table = None if column and "." in column: table, column = column.split(".") - return self.column_string().format(column=column, separator=separator, table=table or self.table) + return self.column_string().format( + column=column, separator=separator, table=table or self.table + ) def _table_column_string(self, column, alias=None, separator=""): """Compiles a column into the column syntax. @@ -914,7 +987,9 @@ def drop_table(self, table): Returns: self """ - self._sql = self.drop_table_string().format(table=self.process_column(table)) + self._sql = self.drop_table_string().format( + table=self.process_column(table) + ) return self def drop_table_if_exists(self, table): @@ -926,7 +1001,9 @@ def drop_table_if_exists(self, table): Returns: self """ - self._sql = self.drop_table_if_exists_string().format(table=self.process_column(table)) + self._sql = self.drop_table_if_exists_string().format( + table=self.process_column(table) + ) return self def rename_table(self, current_table_name, new_table_name): @@ -954,7 +1031,9 @@ def truncate_table(self, table, foreign_keys=False): Returns: self """ - raise NotImplementedError(f"'{self.__class__.__name__}' does not support truncating") + raise NotImplementedError( + f"'{self.__class__.__name__}' does not support truncating" + ) def where_regexp_string(self): return "{keyword} {column} REGEXP {value}" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py index 4ee2c167..e8eb6a53 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py @@ -120,10 +120,14 @@ def process_table(self, table): if not table: return "" if isinstance(table, str): - return ".".join(self.table_string().format(table=t) for t in table.split(".")) + return ".".join( + self.table_string().format(table=t) for t in table.split(".") + ) if table.raw: return table.name - return ".".join(self.table_string().format(table=t) for t in table.name.split(".")) + return ".".join( + self.table_string().format(table=t) for t in table.name.split(".") + ) def subquery_alias_string(self): return "AS {alias}" @@ -147,9 +151,7 @@ def column_exists_string(self): return "SHOW COLUMNS FROM {table} LIKE {value}" def table_exists_string(self): - return ( - "SELECT * from information_schema.tables where table_name='{clean_table}' AND table_schema = '{database}'" - ) + return "SELECT * from information_schema.tables where table_name='{clean_table}' AND table_schema = '{database}'" def create_column_length(self, column_type): return "({length})" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py index 4d464061..ecc7847d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py @@ -24,7 +24,9 @@ def process_insert_get_id(self, builder, results, id_key): dictionary: Should return the modified dictionary. """ - last_id = builder.new_connection().query("SELECT @@Identity as [id]", results=1) + last_id = builder.new_connection().query( + "SELECT @@Identity as [id]", results=1 + ) id = last_id["id"] diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py index 08d7e2aa..6de4e289 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py @@ -23,7 +23,9 @@ def process_insert_get_id(self, builder, results, id_key): """ if id_key not in results: - results.update({id_key: builder._connection.get_cursor().lastrowid}) + results.update( + {id_key: builder._connection.get_cursor().lastrowid} + ) return results def get_column_value(self, builder, column, results, id_key, id_value): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py index 3d295d7a..ea1e5727 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py @@ -23,7 +23,9 @@ def process_insert_get_id(self, builder, results, id_key="id"): """ if id_key not in results: - results.update({id_key: builder.get_connection().get_last_row_id()}) + results.update( + {id_key: builder.get_connection().get_last_row_id()} + ) return results diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/support.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/support.py index e6829ece..04f884a6 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/support.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/query/support.py @@ -29,6 +29,9 @@ def _extract_operator_value(*args): value = args[0] if operator not in operators: - raise ValueError("Invalid comparison operator. The operator can be %s" % ", ".join(operators)) + raise ValueError( + "Invalid comparison operator. The operator can be %s" + % ", ".join(operators) + ) return operator, value diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py index 765642af..17848bb8 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py @@ -57,12 +57,16 @@ def apply_query(self, foreign, owner): dict -- A dictionary of data which will be hydrated. """ klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'apply_query' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'apply_query' method" + ) def query_where_exists(self, builder, callback, method="where_exists"): """Adds a criteria clause to the query filter for existing related records""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'query_where_exists' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'query_where_exists' method" + ) def joins(self, builder, clause=None): """Helper method for adding join clauses to a relationship""" @@ -79,41 +83,59 @@ def joins(self, builder, clause=None): def get_with_count_query(self, builder, callback): """Adds a clause to the query to get the record count of the relationship""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'get_with_count_query' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'get_with_count_query' method" + ) def attach(self, current_model, related_record): """Link a related model to the current model""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'attach' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'attach' method" + ) def get_related(self, query, relation, eagers=None, callback=None): klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'get_related' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'get_related' method" + ) def relate(self, related_record): klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'relate' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'relate' method" + ) def detach(self, current_model, related_record): """Unlink a related model from the current model""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'detach' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'detach' method" + ) def attach_related(self, current_model, related_record): """Unlink a related model from the current model""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'attach_related' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'attach_related' method" + ) def detach_related(self, current_model, related_record): """Unlink a related model from the current model""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'detach_related' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'detach_related' method" + ) def query_has(self, current_query_builder, method="where_exists"): """Adds a clause to the query to check if a relation exists""" klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'query_has' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'query_has' method" + ) def map_related(self, related_result): klass = self.__class__.__name__ - raise NotImplementedError(f"{klass} relationship does not implement the 'map_related' method") + raise NotImplementedError( + f"{klass} relationship does not implement the 'map_related' method" + ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py index 159c3040..d16d8793 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py @@ -1,7 +1,8 @@ -from fastapi_startkit.masoniteorm.models import registry +from typing import Callable from ..collection import Collection from . import BaseRelationship +from fastapi_startkit.masoniteorm.models import registry class BelongsTo(BaseRelationship): @@ -29,7 +30,9 @@ def apply_query(self, foreign, owner): Returns: dict -- A dictionary of data which will be hydrated. """ - return foreign.where(self.foreign_key, owner.__attributes__[self.local_key]).first() + return foreign.where( + self.foreign_key, owner.__attributes__[self.local_key] + ).first() def query_has(self, current_query_builder, method="where_exists"): related_builder = self.get_builder() @@ -106,5 +109,7 @@ def relate(self, related_record): return ( self.get_builder() .where(self.foreign_key, related_record.__attributes__[self.local_key]) - ._set_creates_related({self.foreign_key: related_record.__attributes__[self.local_key]}) + ._set_creates_related( + {self.foreign_key: related_record.__attributes__[self.local_key]} + ) ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py index c08e874b..1a4d2f3e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py @@ -1,28 +1,27 @@ import pendulum from inflection import singularize -from fastapi_startkit.masoniteorm.models import registry - from ..collection import Collection from ..models.pivot import Pivot from .BaseRelationship import BaseRelationship +from fastapi_startkit.masoniteorm.models import registry class BelongsToMany(BaseRelationship): """Has Many Relationship Class.""" def __init__( - self, - fn=None, - local_foreign_key=None, - other_foreign_key=None, - local_owner_key=None, - other_owner_key=None, - table=None, - with_timestamps=False, - pivot_id="id", - attribute="pivot", - with_fields=[], + self, + fn=None, + local_foreign_key=None, + other_foreign_key=None, + local_owner_key=None, + other_owner_key=None, + table=None, + with_timestamps=False, + pivot_id="id", + attribute="pivot", + with_fields=[], ): if isinstance(fn, str): self.fn = self.fn = lambda x: registry.Registry.resolve(fn) @@ -101,7 +100,9 @@ async def apply_query(self, query, owner): ) if hasattr(owner, self.local_owner_key): - result.where(f"{table1}.{self.local_owner_key}", getattr(owner, self.local_owner_key)) + result.where( + f"{table1}.{self.local_owner_key}", getattr(owner, self.local_owner_key) + ) if self.with_fields: for field in self.with_fields: @@ -236,10 +237,14 @@ async def make_query(self, query, relation, eagers=None, callback=None): Collection(relation._get_value(self.local_owner_key)).unique(), ).get() else: - return await result.where(self.local_owner_key, getattr(relation, self.local_owner_key)).get() + return await result.where( + self.local_owner_key, getattr(relation, self.local_owner_key) + ).get() async def get_related(self, query, relation, eagers=None, callback=None): - final_result = await self.make_query(query, relation, eagers=eagers, callback=callback) + final_result = await self.make_query( + query, relation, eagers=eagers, callback=callback + ) builder = self.make_builder(eagers) for model in final_result: @@ -330,7 +335,9 @@ def relate(self, related_record): ) if hasattr(owner, self.local_owner_key): - result.where(f"{table1}.{self.local_owner_key}", getattr(owner, self.local_owner_key)) + result.where( + f"{table1}.{self.local_owner_key}", getattr(owner, self.local_owner_key) + ) if self.with_fields: for field in self.with_fields: @@ -342,7 +349,13 @@ def map_related(self, related_result): return related_result def register_related(self, key, model, collection): - model.add_relation({key: collection.where(f"{self._table}_id", getattr(model, self.local_owner_key))}) + model.add_relation( + { + key: collection.where( + f"{self._table}_id", getattr(model, self.local_owner_key) + ) + } + ) def joins(self, builder, clause=None): if not self._table: @@ -424,7 +437,9 @@ def query_where_exists(self, builder, callback, method="where_exists"): f"{pivot_table}.{self.local_key}", f"{builder.get_table_name()}.{self.local_owner_key}", ) - .where_in(self.other_owner_key, callback(query.select(self.other_owner_key))) + .where_in( + self.other_owner_key, callback(query.select(self.other_owner_key)) + ) ) def query_has(self, builder, method="where_exists"): @@ -464,18 +479,22 @@ def get_with_count_query(self, builder, callback): return_query = builder.add_select( f"{query.get_table_name()}_count", lambda q: ( - q.count("*") - .where_column( - f"{builder.get_table_name()}.{self.local_owner_key}", - f"{self._table}.{self.local_key}", - ) - .table(self._table) - .when( - callback, - lambda q: q.where_in( - self.foreign_key, - callback(query.select(self.other_owner_key)), - ), + ( + q.count("*") + .where_column( + f"{builder.get_table_name()}.{self.local_owner_key}", + f"{self._table}.{self.local_key}", + ) + .table(self._table) + .when( + callback, + lambda q: ( + q.where_in( + self.foreign_key, + callback(query.select(self.other_owner_key)), + ) + ), + ) ) ), ) @@ -488,7 +507,9 @@ def attach(self, current_model, related_record): self.foreign_key: getattr(related_record, self.other_owner_key), } - self._table = self._table or self.get_pivot_table_name(current_model, related_record) + self._table = self._table or self.get_pivot_table_name( + current_model, related_record + ) if self.with_timestamps: data.update( @@ -498,7 +519,12 @@ def attach(self, current_model, related_record): } ) - return Pivot.on(current_model.get_builder().connection).table(self._table).without_global_scopes().create(data) + return ( + Pivot.on(current_model.get_builder().connection) + .table(self._table) + .without_global_scopes() + .create(data) + ) def detach(self, current_model, related_record): data = { @@ -506,7 +532,9 @@ def detach(self, current_model, related_record): self.foreign_key: getattr(related_record, self.other_owner_key), } - self._table = self._table or self.get_pivot_table_name(current_model, related_record) + self._table = self._table or self.get_pivot_table_name( + current_model, related_record + ) return ( Pivot.on(current_model.get_builder().connection) @@ -522,7 +550,9 @@ def attach_related(self, current_model, related_record): self.foreign_key: getattr(related_record, self.other_owner_key), } - self._table = self._table or self.get_pivot_table_name(current_model, related_record) + self._table = self._table or self.get_pivot_table_name( + current_model, related_record + ) if self.with_timestamps: data.update( @@ -545,7 +575,9 @@ def detach_related(self, current_model, related_record): self.foreign_key: getattr(related_record, self.other_owner_key), } - self._table = self._table or self.get_pivot_table_name(current_model, related_record) + self._table = self._table or self.get_pivot_table_name( + current_model, related_record + ) if self.with_timestamps: data.update( diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasMany.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasMany.py index 03f45f28..1a40ad7e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasMany.py @@ -1,5 +1,5 @@ -from ..collection import Collection from .BaseRelationship import BaseRelationship +from ..collection import Collection class HasMany(BaseRelationship): @@ -15,7 +15,9 @@ def apply_query(self, foreign, owner): Returns: dict -- A dictionary of data which will be hydrated. """ - result = foreign.where(self.foreign_key, owner.__attributes__[self.local_key]).get() + result = foreign.where( + self.foreign_key, owner.__attributes__[self.local_key] + ).get() return result @@ -26,7 +28,9 @@ def set_keys(self, owner, attribute): return self def register_related(self, key, model, collection): - model.add_relation({key: collection.get(getattr(model, self.local_key)) or Collection()}) + model.add_relation( + {key: collection.get(getattr(model, self.local_key)) or Collection()} + ) def map_related(self, related_result): return related_result.group_by(self.foreign_key) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py index 3795d727..1297524e 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py @@ -1,5 +1,4 @@ from fastapi_startkit.masoniteorm.models import registry - from ..collection import Collection from .BaseRelationship import BaseRelationship @@ -8,14 +7,16 @@ class HasManyThrough(BaseRelationship): """HasManyThrough Relationship Class.""" def __init__( - self, - fn=list[str], - local_foreign_key=None, - other_foreign_key=None, - local_owner_key=None, - other_owner_key=None, + self, + fn=list[str], + local_foreign_key=None, + other_foreign_key=None, + local_owner_key=None, + other_owner_key=None, ): - self.fn = lambda x: [registry.Registry.resolve(class_str) for class_str in fn] + self.fn = lambda x: [ + registry.Registry.resolve(class_str) for class_str in fn + ] self.local_key = local_foreign_key self.foreign_key = other_foreign_key @@ -62,7 +63,9 @@ def __get__(self, instance, owner): if self.attribute in instance._relationships: return instance._relationships[self.attribute] - return self.apply_related_query(self.distant_builder, self.intermediary_builder, instance) + return self.apply_related_query( + self.distant_builder, self.intermediary_builder, instance + ) def apply_related_query(self, distant_builder, intermediary_builder, owner): """ @@ -83,7 +86,9 @@ def apply_related_query(self, distant_builder, intermediary_builder, owner): intermediate_table = intermediary_builder.get_table_name() return ( - self.distant_builder.select(f"{distant_table}.*, {intermediate_table}.{self.local_key}") + self.distant_builder.select( + f"{distant_table}.*, {intermediate_table}.{self.local_key}" + ) .join( f"{intermediate_table}", f"{intermediate_table}.{self.foreign_key}", @@ -154,7 +159,9 @@ async def get_related(self, current_builder, relation, eagers=None, callback=Non callback(current_builder) ( - self.distant_builder.select(f"{distant_table}.*, {intermediate_table}.{self.local_key}").join( + self.distant_builder.select( + f"{distant_table}.*, {intermediate_table}.{self.local_key}" + ).join( f"{intermediate_table}", f"{intermediate_table}.{self.foreign_key}", "=", @@ -206,7 +213,7 @@ def query_where_exists(self, current_builder, callback, method="where_exists"): f"{intermediate_table}.{self.local_key}", f"{current_builder.get_table_name()}.{self.local_owner_key}", ) - .when(callback, lambda q: callback(q)) + .when(callback, lambda q: (callback(q))) ) def get_with_count_query(self, current_builder, callback): @@ -219,24 +226,30 @@ def get_with_count_query(self, current_builder, callback): return_query = current_builder.add_select( f"{self.attribute}_count", lambda q: ( - q.count("*") - .join( - f"{intermediate_table}", - f"{intermediate_table}.{self.foreign_key}", - "=", - f"{distant_table}.{self.other_owner_key}", - ) - .where_column( - f"{intermediate_table}.{self.local_key}", - f"{current_builder.get_table_name()}.{self.local_owner_key}", - ) - .table(distant_table) - .when( - callback, - lambda q: q.where_in( - self.foreign_key, - callback(self.distant_builder.select(self.other_owner_key)), - ), + ( + q.count("*") + .join( + f"{intermediate_table}", + f"{intermediate_table}.{self.foreign_key}", + "=", + f"{distant_table}.{self.other_owner_key}", + ) + .where_column( + f"{intermediate_table}.{self.local_key}", + f"{current_builder.get_table_name()}.{self.local_owner_key}", + ) + .table(distant_table) + .when( + callback, + lambda q: ( + q.where_in( + self.foreign_key, + callback( + self.distant_builder.select(self.other_owner_key) + ), + ) + ), + ) ) ), ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOne.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOne.py index 74829d3b..f2240eda 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOne.py @@ -1,7 +1,8 @@ -from fastapi_startkit.masoniteorm.models import registry +import inflection from ..collection import Collection from .BaseRelationship import BaseRelationship +from fastapi_startkit.masoniteorm.models import registry class HasOne(BaseRelationship): @@ -20,7 +21,9 @@ def set_keys(self, owner, attribute): return self def apply_query(self, foreign, owner): - return foreign.where(self.foreign_key, owner.__attributes__[self.local_key]).first() + return foreign.where( + self.foreign_key, owner.__attributes__[self.local_key] + ).first() async def get_related(self, query, relation, eagers=(), callback=None): builder = self.get_builder().with_(eagers) @@ -55,7 +58,9 @@ def query_has(self, current_query_builder, method="where_exists"): return related_builder def register_related(self, key, model, collection): - related = collection.where(self.foreign_key, getattr(model, self.local_key)).first() + related = collection.where( + self.foreign_key, getattr(model, self.local_key) + ).first() model.add_relation({key: related or None}) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py index caf89ca8..72fe6c22 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py @@ -1,21 +1,22 @@ -from fastapi_startkit.masoniteorm.models import registry - from ..collection import Collection from .BaseRelationship import BaseRelationship +from fastapi_startkit.masoniteorm.models import registry class HasOneThrough(BaseRelationship): """HasOneThrough Relationship Class.""" def __init__( - self, - fn=list[str], - local_foreign_key=None, - other_foreign_key=None, - local_owner_key=None, - other_owner_key=None, + self, + fn=list[str], + local_foreign_key=None, + other_foreign_key=None, + local_owner_key=None, + other_owner_key=None, ): - self.fn = lambda x: [registry.Registry.resolve(class_str) for class_str in fn] + self.fn = lambda x: [ + registry.Registry.resolve(class_str) for class_str in fn + ] self.local_key = local_foreign_key self.foreign_key = other_foreign_key @@ -61,7 +62,9 @@ def __get__(self, instance, owner): if self.attribute in instance._relationships: return instance._relationships[self.attribute] - return self.apply_relation_query(self.distant_builder, self.intermediary_builder, instance) + return self.apply_relation_query( + self.distant_builder, self.intermediary_builder, instance + ) def apply_relation_query(self, distant_builder, intermediary_builder, owner): """ @@ -83,7 +86,9 @@ def apply_relation_query(self, distant_builder, intermediary_builder, owner): int_table = intermediary_builder.get_table_name() return ( - distant_builder.select(f"{dist_table}.*, {int_table}.{self.local_owner_key} as {self.local_key}") + distant_builder.select( + f"{dist_table}.*, {int_table}.{self.local_owner_key} as {self.local_key}" + ) .join( f"{int_table}", f"{int_table}.{self.foreign_key}", @@ -157,7 +162,9 @@ async def get_related(self, current_builder, relation, eagers=None, callback=Non callback(current_builder) ( - self.distant_builder.select(f"{dist_table}.*, {int_table}.{self.local_owner_key} as {self.local_key}").join( + self.distant_builder.select( + f"{dist_table}.*, {int_table}.{self.local_owner_key} as {self.local_key}" + ).join( f"{int_table}", f"{int_table}.{self.foreign_key}", "=", @@ -209,7 +216,7 @@ def query_where_exists(self, current_builder, callback, method="where_exists"): f"{int_table}.{self.local_owner_key}", f"{current_builder.get_table_name()}.{self.local_key}", ) - .when(callback, lambda q: callback(q)) + .when(callback, lambda q: (callback(q))) ) def get_with_count_query(self, current_builder, callback): @@ -222,24 +229,30 @@ def get_with_count_query(self, current_builder, callback): return_query = current_builder.add_select( f"{self.attribute}_count", lambda q: ( - q.count("*") - .join( - f"{int_table}", - f"{int_table}.{self.foreign_key}", - "=", - f"{dist_table}.{self.other_owner_key}", - ) - .where_column( - f"{int_table}.{self.local_owner_key}", - f"{current_builder.get_table_name()}.{self.local_key}", - ) - .table(dist_table) - .when( - callback, - lambda q: q.where_in( - self.foreign_key, - callback(self.distant_builder.select(self.other_owner_key)), - ), + ( + q.count("*") + .join( + f"{int_table}", + f"{int_table}.{self.foreign_key}", + "=", + f"{dist_table}.{self.other_owner_key}", + ) + .where_column( + f"{int_table}.{self.local_owner_key}", + f"{current_builder.get_table_name()}.{self.local_key}", + ) + .table(dist_table) + .when( + callback, + lambda q: ( + q.where_in( + self.foreign_key, + callback( + self.distant_builder.select(self.other_owner_key) + ), + ) + ), + ) ) ), ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py index 9ab18105..f7803fde 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py @@ -90,7 +90,9 @@ def get_related(self, query, relation, eagers=None, callback=None): record_type, ).where_in( self.morph_id, - relation.pluck(relation.first().get_primary_key(), keep_nulls=False).unique(), + relation.pluck( + relation.first().get_primary_key(), keep_nulls=False + ).unique(), ) ).get() return ( @@ -100,7 +102,9 @@ def get_related(self, query, relation, eagers=None, callback=None): ) .where_in( self.morph_id, - relation.pluck(relation.first().get_primary_key(), keep_nulls=False).unique(), + relation.pluck( + relation.first().get_primary_key(), keep_nulls=False + ).unique(), ) .get() ) @@ -122,7 +126,9 @@ def get_related(self, query, relation, eagers=None, callback=None): def register_related(self, key, model, collection): record_type = self.get_record_key_lookup(model) - related = collection.where(self.morph_key, record_type).where(self.morph_id, model.get_primary_key_value()) + related = collection.where(self.morph_key, record_type).where( + self.morph_id, model.get_primary_key_value() + ) model.add_relation({key: related}) @@ -137,6 +143,8 @@ def get_record_key_lookup(self, relation): break if not record_type: - raise ValueError(f"Could not find the record type key for the {relation} class") + raise ValueError( + f"Could not find the record type key for the {relation} class" + ) return record_type diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py index 72ce6b48..219a27fb 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py @@ -91,7 +91,9 @@ def get_related(self, query, relation, eagers=None, callback=None): record_type, ).where_in( self.morph_id, - relation.pluck(relation.first().get_primary_key(), keep_nulls=False).unique(), + relation.pluck( + relation.first().get_primary_key(), keep_nulls=False + ).unique(), ) ).get() @@ -102,7 +104,9 @@ def get_related(self, query, relation, eagers=None, callback=None): ) .where_in( self.morph_id, - relation.pluck(relation.first().get_primary_key(), keep_nulls=False).unique(), + relation.pluck( + relation.first().get_primary_key(), keep_nulls=False + ).unique(), ) .get() ) @@ -125,7 +129,9 @@ def get_related(self, query, relation, eagers=None, callback=None): def register_related(self, key, model, collection): record_type = self.get_record_key_lookup(model) related = ( - collection.where(self.morph_key, record_type).where(self.morph_id, model.get_primary_key_value()).first() + collection.where(self.morph_key, record_type) + .where(self.morph_id, model.get_primary_key_value()) + .first() ) model.add_relation({key: related}) @@ -141,6 +147,8 @@ def get_record_key_lookup(self, relation): break if not record_type: - raise ValueError(f"Could not find the record type key for the {relation} class") + raise ValueError( + f"Could not find the record type key for the {relation} class" + ) return record_type diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py index ec7b3369..9fc4f59f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py @@ -1,5 +1,4 @@ from fastapi_startkit.masoniteorm.models import registry - from ..collection import Collection from .BaseRelationship import BaseRelationship @@ -84,8 +83,10 @@ async def get_related(self, query, relation, eagers=None, callback=None): relations.merge( await morphed_model.where_in( f"{morphed_model.get_table_name()}.{morphed_model.get_primary_key()}", - Collection(items).pluck(self.morph_id, keep_nulls=False).unique(), - ).get() + Collection(items) + .pluck(self.morph_id, keep_nulls=False) + .unique(), + ).get() ) return relations else: @@ -96,7 +97,9 @@ async def get_related(self, query, relation, eagers=None, callback=None): def register_related(self, key, model, collection): morphed_model = self.morph_map().get(getattr(model, self.morph_key)) - related = collection.where(morphed_model.get_primary_key(), getattr(model, self.morph_id)).first() + related = collection.where( + morphed_model.get_primary_key(), getattr(model, self.morph_id) + ).first() model.add_relation({key: related}) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py index f647f250..bd86bcbf 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py @@ -83,8 +83,10 @@ def get_related(self, query, relation, eagers=None, callback=None): relations.merge( morphed_model.where_in( f"{morphed_model.get_table_name()}.{morphed_model.get_primary_key()}", - Collection(items).pluck(self.morph_id, keep_nulls=False).unique(), - ).get() + Collection(items) + .pluck(self.morph_id, keep_nulls=False) + .unique(), + ).get() ) return relations else: @@ -95,7 +97,9 @@ def get_related(self, query, relation, eagers=None, callback=None): def register_related(self, key, model, collection): morphed_model = self.morph_map().get(getattr(model, self.morph_key)) - related = collection.where(morphed_model.get_primary_key(), getattr(model, self.morph_id)) + related = collection.where( + morphed_model.get_primary_key(), getattr(model, self.morph_id) + ) model.add_relation({key: related}) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Blueprint.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Blueprint.py index f2176392..3b898094 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Blueprint.py @@ -37,7 +37,9 @@ def string(self, column, length=255, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "string", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "string", length=length, nullable=nullable + ) return self @@ -54,7 +56,9 @@ def tiny_integer(self, column, length=1, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "tiny_integer", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "tiny_integer", length=length, nullable=nullable + ) return self def small_integer(self, column, length=5, nullable=False): @@ -70,7 +74,9 @@ def small_integer(self, column, length=5, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "small_integer", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "small_integer", length=length, nullable=nullable + ) return self def medium_integer(self, column, length=7, nullable=False): @@ -86,7 +92,9 @@ def medium_integer(self, column, length=7, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "medium_integer", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "medium_integer", length=length, nullable=nullable + ) return self def integer(self, column, length=11, nullable=False): @@ -102,7 +110,9 @@ def integer(self, column, length=11, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "integer", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "integer", length=length, nullable=nullable + ) return self def big_integer(self, column, length=32, nullable=False): @@ -118,7 +128,9 @@ def big_integer(self, column, length=32, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "big_integer", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "big_integer", length=length, nullable=nullable + ) return self def unsigned_big_integer(self, column, length=32, nullable=False): @@ -134,13 +146,19 @@ def unsigned_big_integer(self, column, length=32, nullable=False): Returns: self """ - return self.big_integer(column, length=length, nullable=nullable).unsigned() + return self.big_integer( + column, length=length, nullable=nullable + ).unsigned() def _compile_create(self): - return self.grammar(creates=self._columns, table=self.table)._compile_create() + return self.grammar( + creates=self._columns, table=self.table + )._compile_create() def _compile_alter(self): - return self.grammar(creates=self._columns, table=self.table)._compile_create() + return self.grammar( + creates=self._columns, table=self.table + )._compile_create() def increments(self, column, nullable=False): """Sets a column to be the auto incrementing primary key representation for the table. @@ -154,7 +172,9 @@ def increments(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "increments", nullable=nullable) + self._last_column = self.table.add_column( + column, "increments", nullable=nullable + ) self.primary(column) return self @@ -171,7 +191,9 @@ def tiny_increments(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "tiny_increments", nullable=nullable) + self._last_column = self.table.add_column( + column, "tiny_increments", nullable=nullable + ) self.primary(column) return self @@ -199,7 +221,9 @@ def uuid(self, column, nullable=False, length=36): Returns: self """ - self._last_column = self.table.add_column(column, "uuid", nullable=nullable, length=length) + self._last_column = self.table.add_column( + column, "uuid", nullable=nullable, length=length + ) return self def big_increments(self, column, nullable=False): @@ -214,7 +238,9 @@ def big_increments(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "big_increments", nullable=nullable) + self._last_column = self.table.add_column( + column, "big_increments", nullable=nullable + ) self.primary(column) return self @@ -231,7 +257,9 @@ def binary(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "binary", nullable=nullable) + self._last_column = self.table.add_column( + column, "binary", nullable=nullable + ) return self def boolean(self, column, nullable=False): @@ -246,7 +274,9 @@ def boolean(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "boolean", nullable=nullable) + self._last_column = self.table.add_column( + column, "boolean", nullable=nullable + ) return self def default(self, value, raw=False): @@ -271,7 +301,9 @@ def char(self, column, length=1, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "char", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "char", length=length, nullable=nullable + ) return self def date(self, column, nullable=False): @@ -286,7 +318,9 @@ def date(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "date", nullable=nullable) + self._last_column = self.table.add_column( + column, "date", nullable=nullable + ) return self def time(self, column, nullable=False): @@ -301,7 +335,9 @@ def time(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "time", nullable=nullable) + self._last_column = self.table.add_column( + column, "time", nullable=nullable + ) return self def datetime(self, column, nullable=False, now=False): @@ -318,7 +354,9 @@ def datetime(self, column, nullable=False, now=False): Returns: self """ - self._last_column = self.table.add_column(column, "datetime", nullable=nullable) + self._last_column = self.table.add_column( + column, "datetime", nullable=nullable + ) if now: self._last_column.use_current() @@ -339,7 +377,9 @@ def timestamp(self, column, nullable=False, now=False): self """ - self._last_column = self.table.add_column(column, "timestamp", nullable=nullable) + self._last_column = self.table.add_column( + column, "timestamp", nullable=nullable + ) if now: self._last_column.use_current() @@ -376,7 +416,9 @@ def decimal(self, column, length=17, precision=6, nullable=False): self._last_column = self.table.add_column( column, "decimal", - length="{length}, {precision}".format(length=length, precision=precision), + length="{length}, {precision}".format( + length=length, precision=precision + ), nullable=nullable, ) return self @@ -398,7 +440,9 @@ def float(self, column, length=19, precision=4, nullable=False): self._last_column = self.table.add_column( column, "float", - length="{length}, {precision}".format(length=length, precision=precision), + length="{length}, {precision}".format( + length=length, precision=precision + ), nullable=nullable, ) return self @@ -415,7 +459,9 @@ def double(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "double", nullable=nullable) + self._last_column = self.table.add_column( + column, "double", nullable=nullable + ) return self def enum(self, column, options=None, nullable=False): @@ -437,7 +483,9 @@ def enum(self, column, options=None, nullable=False): for option in options: new_options += "'{}',".format(option) new_options = new_options.rstrip(",") - self._last_column = self.table.add_column(column, "enum", length="255", values=options, nullable=nullable) + self._last_column = self.table.add_column( + column, "enum", length="255", values=options, nullable=nullable + ) return self def text(self, column, length=None, nullable=False): @@ -453,7 +501,9 @@ def text(self, column, length=None, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "text", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "text", length=length, nullable=nullable + ) return self def tiny_text(self, column, length=None, nullable=False): @@ -469,7 +519,9 @@ def tiny_text(self, column, length=None, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "tiny_text", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "tiny_text", length=length, nullable=nullable + ) return self def unsigned_decimal(self, column, length=17, precision=6, nullable=False): @@ -488,7 +540,9 @@ def unsigned_decimal(self, column, length=17, precision=6, nullable=False): self._last_column = self.table.add_column( column, "decimal", - length="{length}, {precision}".format(length=length, precision=precision), + length="{length}, {precision}".format( + length=length, precision=precision + ), nullable=nullable, ).unsigned() return self @@ -507,7 +561,9 @@ def long_text(self, column, length=None, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "long_text", length=length, nullable=nullable) + self._last_column = self.table.add_column( + column, "long_text", length=length, nullable=nullable + ) return self def json(self, column, nullable=False): @@ -522,7 +578,9 @@ def json(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "json", nullable=nullable) + self._last_column = self.table.add_column( + column, "json", nullable=nullable + ) return self def jsonb(self, column, nullable=False): @@ -537,7 +595,9 @@ def jsonb(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "jsonb", nullable=nullable) + self._last_column = self.table.add_column( + column, "jsonb", nullable=nullable + ) return self def inet(self, column, length=255, nullable=False): @@ -552,7 +612,9 @@ def inet(self, column, length=255, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "inet", length=255, nullable=nullable) + self._last_column = self.table.add_column( + column, "inet", length=255, nullable=nullable + ) return self def cidr(self, column, length=255, nullable=False): @@ -567,7 +629,9 @@ def cidr(self, column, length=255, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "cidr", length=255, nullable=nullable) + self._last_column = self.table.add_column( + column, "cidr", length=255, nullable=nullable + ) return self def macaddr(self, column, length=255, nullable=False): @@ -582,7 +646,9 @@ def macaddr(self, column, length=255, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "macaddr", length=255, nullable=nullable) + self._last_column = self.table.add_column( + column, "macaddr", length=255, nullable=nullable + ) return self def point(self, column, nullable=False): @@ -597,7 +663,9 @@ def point(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "point", nullable=nullable) + self._last_column = self.table.add_column( + column, "point", nullable=nullable + ) return self def geometry(self, column, nullable=False): @@ -612,7 +680,9 @@ def geometry(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "geometry", nullable=nullable) + self._last_column = self.table.add_column( + column, "geometry", nullable=nullable + ) return self def year(self, column, length=4, default=None, nullable=False): @@ -627,7 +697,9 @@ def year(self, column, length=4, default=None, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "year", length=length, nullable=nullable, default=default) + self._last_column = self.table.add_column( + column, "year", length=length, nullable=nullable, default=default + ) return self def unsigned(self, column=None, length=None, nullable=False): @@ -647,7 +719,9 @@ def unsigned(self, column=None, length=None, nullable=False): self._last_column.unsigned() return self - self._last_column = self.table.add_column(column, "unsigned", length=length, nullable=nullable).unsigned() + self._last_column = self.table.add_column( + column, "unsigned", length=length, nullable=nullable + ).unsigned() return self def unsigned_integer(self, column, nullable=False): @@ -662,7 +736,9 @@ def unsigned_integer(self, column, nullable=False): Returns: self """ - self._last_column = self.table.add_column(column, "integer", nullable=nullable).unsigned() + self._last_column = self.table.add_column( + column, "integer", nullable=nullable + ).unsigned() return self def morphs(self, column, nullable=False, indexes=True): @@ -678,7 +754,11 @@ def morphs(self, column, nullable=False, indexes=True): self """ _columns = [] - _columns.append(self.table.add_column("{}_id".format(column), "integer", nullable=nullable).unsigned()) + _columns.append( + self.table.add_column( + "{}_id".format(column), "integer", nullable=nullable + ).unsigned() + ) _columns.append( self.table.add_column( "{}_type".format(column), @@ -704,11 +784,15 @@ def to_sql(self): if self._action == "create": return self.platform().compile_create_sql(self.table) elif self._action == "create_table_if_not_exists": - return self.platform().compile_create_sql(self.table, if_not_exists=True) + return self.platform().compile_create_sql( + self.table, if_not_exists=True + ) else: if not self._dry: # get current table schema - table = self.platform().get_current_schema(self.connection, self.table.name, schema=self.schema) + table = self.platform().get_current_schema( + self.connection, self.table.name, schema=self.schema + ) self.table.from_table = table return self.platform().compile_alter_sql(self.table) @@ -823,7 +907,9 @@ def fulltext(self, column=None, name=None): if not isinstance(column, list): column = [column] - self.table.add_constraint(name or f"{'_'.join(column)}_fulltext", "fulltext", column) + self.table.add_constraint( + name or f"{'_'.join(column)}_fulltext", "fulltext", column + ) return self @@ -859,9 +945,15 @@ def add_foreign(self, columns, name=None): columns {string} -- The name of the from_column . to_column . table """ if len(columns.split(".")) != 3: - raise Exception("Wrong add_foreign argument, the struncture is from_column.to_column.table") + raise Exception( + "Wrong add_foreign argument, the struncture is from_column.to_column.table" + ) from_column, to_column, table = columns.split(".") - return self.foreign(from_column, name=name).references(to_column).on(table) + return ( + self.foreign(from_column, name=name) + .references(to_column) + .on(table) + ) def foreign(self, column, name=None): """Starts the creation of a foreign key constraint @@ -872,7 +964,9 @@ def foreign(self, column, name=None): Returns: self """ - self._last_foreign = self.table.add_foreign_key(column, name=name or f"{self.table.name}_{column}_foreign") + self._last_foreign = self.table.add_foreign_key( + column, name=name or f"{self.table.name}_{column}_foreign" + ) return self def foreign_id(self, column): @@ -908,7 +1002,11 @@ def foreign_id_for(self, model, column=None): """ clm = column if column else model.get_foreign_key() - return self.foreign_id(clm) if model.get_primary_key_type() == "int" else self.foreign_uuid(column) + return ( + self.foreign_id(clm) + if model.get_primary_key_type() == "int" + else self.foreign_uuid(column) + ) def references(self, column): """Sets the other column on the foreign table that the local column will use to reference. @@ -976,7 +1074,9 @@ def rename(self, old_column, new_column, data_type, length=None): Returns: self """ - self.table.rename_column(old_column, new_column, data_type, length=length) + self.table.rename_column( + old_column, new_column, data_type, length=length + ) return self def after(self, old_column): @@ -1038,7 +1138,9 @@ def drop_unique(self, index): """ if isinstance(index, list): for column in index: - self.table.remove_unique_index(f"{self.table.name}_{column}_unique") + self.table.remove_unique_index( + f"{self.table.name}_{column}_unique" + ) return self diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Table.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Table.py index 419eeb62..5b3b50dd 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Table.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/Table.py @@ -47,9 +47,13 @@ def add_column( return column def add_constraint(self, name, constraint_type, columns=None): - self.added_constraints.update({name: Constraint(name, constraint_type, columns=columns or [])}) + self.added_constraints.update( + {name: Constraint(name, constraint_type, columns=columns or [])} + ) - def add_foreign_key(self, column, table=None, foreign_column=None, name=None): + def add_foreign_key( + self, column, table=None, foreign_column=None, name=None + ): foreign_key = ForeignKeyConstraint( column, table, diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/TableDiff.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/TableDiff.py index 205da558..2901793b 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/TableDiff.py @@ -22,7 +22,9 @@ def __init__(self, name): self.comment = None def remove_constraint(self, name): - self.removed_constraints.update({name: self.from_table.get_constraint(name)}) + self.removed_constraints.update( + {name: self.from_table.get_constraint(name)} + ) def get_removed_constraints(self): return self.removed_constraints diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py index 87d822d2..c1750492 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py @@ -63,18 +63,34 @@ class MSSQLPlatform(Platform): def compile_create_sql(self, table, if_not_exists=False): sql = [] - table_create_format = self.create_if_not_exists_format() if if_not_exists else self.create_format() + table_create_format = ( + self.create_if_not_exists_format() + if if_not_exists + else self.create_format() + ) sql.append( table_create_format.format( table=self.wrap_table(table.name), - columns=", ".join(self.columnize(table.get_added_columns())).strip(), + columns=", ".join( + self.columnize(table.get_added_columns()) + ).strip(), constraints=( - ", " + ", ".join(self.constraintize(table.get_added_constraints(), table)) + ", " + + ", ".join( + self.constraintize( + table.get_added_constraints(), table + ) + ) if table.get_added_constraints() else "" ), foreign_keys=( - ", " + ", ".join(self.foreign_key_constraintize(table.name, table.added_foreign_keys)) + ", " + + ", ".join( + self.foreign_key_constraintize( + table.name, table.added_foreign_keys + ) + ) if table.added_foreign_keys else "" ), @@ -100,7 +116,8 @@ def compile_alter_sql(self, table): sql.append( self.alter_format().format( table=self.wrap_table(table.name), - columns="ADD " + ", ".join(self.columnize(table.added_columns)).strip(), + columns="ADD " + + ", ".join(self.columnize(table.added_columns)).strip(), ) ) @@ -108,19 +125,26 @@ def compile_alter_sql(self, table): sql.append( self.alter_format().format( table=self.wrap_table(table.name), - columns="ALTER COLUMN " + ", ".join(self.columnize(table.changed_columns)).strip(), + columns="ALTER COLUMN " + + ", ".join(self.columnize(table.changed_columns)).strip(), ) ) if table.renamed_columns: for name, column in table.get_renamed_columns().items(): - sql.append(self.rename_column_string(table.name, name, column.name).strip()) + sql.append( + self.rename_column_string( + table.name, name, column.name + ).strip() + ) if table.dropped_columns: dropped_sql = [] for name in table.get_dropped_columns(): - dropped_sql.append(self.drop_column_string().format(name=name).strip()) + dropped_sql.append( + self.drop_column_string().format(name=name).strip() + ) sql.append( self.alter_format().format( @@ -136,21 +160,21 @@ def compile_alter_sql(self, table): ) in table.get_added_foreign_keys().items(): cascade = "" if foreign_key_constraint.delete_action: - cascade += ( - f" ON DELETE {self.foreign_key_actions.get(foreign_key_constraint.delete_action.lower())}" - ) + cascade += f" ON DELETE {self.foreign_key_actions.get(foreign_key_constraint.delete_action.lower())}" if foreign_key_constraint.update_action: - cascade += ( - f" ON UPDATE {self.foreign_key_actions.get(foreign_key_constraint.update_action.lower())}" - ) + cascade += f" ON UPDATE {self.foreign_key_actions.get(foreign_key_constraint.update_action.lower())}" sql.append( f"ALTER TABLE {self.wrap_table(table.name)} ADD " + self.get_foreign_key_constraint_string().format( constraint_name=foreign_key_constraint.constraint_name, column=self.wrap_column(column), table=self.wrap_table(table.name), - foreign_table=self.wrap_table(foreign_key_constraint.foreign_table), - foreign_column=self.wrap_column(foreign_key_constraint.foreign_column), + foreign_table=self.wrap_table( + foreign_key_constraint.foreign_table + ), + foreign_column=self.wrap_column( + foreign_key_constraint.foreign_column + ), cascade=cascade, ) ) @@ -158,7 +182,9 @@ def compile_alter_sql(self, table): if table.dropped_foreign_keys: constraints = table.dropped_foreign_keys for constraint in constraints: - sql.append(f"ALTER TABLE {self.wrap_table(table.name)} DROP CONSTRAINT {constraint}") + sql.append( + f"ALTER TABLE {self.wrap_table(table.name)} DROP CONSTRAINT {constraint}" + ) if table.added_indexes: for name, index in table.added_indexes.items(): @@ -170,12 +196,18 @@ def compile_alter_sql(self, table): ) ) - if table.removed_indexes or table.removed_unique_indexes or table.dropped_primary_keys: + if ( + table.removed_indexes + or table.removed_unique_indexes + or table.dropped_primary_keys + ): constraints = table.removed_indexes constraints += table.removed_unique_indexes constraints += table.dropped_primary_keys for constraint in constraints: - sql.append(f"DROP INDEX {self.wrap_table(table.name)}.{self.wrap_table(constraint)}") + sql.append( + f"DROP INDEX {self.wrap_table(table.name)}.{self.wrap_table(constraint)}" + ) if table.added_constraints: for name, constraint in table.added_constraints.items(): @@ -204,7 +236,9 @@ def columnize(self, columns): sql = [] for name, column in columns.items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length(column.column_type).format( + length=column.length + ) else: length = "" @@ -215,7 +249,10 @@ def columnize(self, columns): elif column.default in self.premapped_defaults.keys(): default = self.premapped_defaults.get(column.default) elif column.default: - if isinstance(column.default, (str,)) and not column.default_is_raw: + if ( + isinstance(column.default, (str,)) + and not column.default_is_raw + ): default = f" DEFAULT '{column.default}'" else: default = f" DEFAULT {column.default}" @@ -254,7 +291,9 @@ def constraintize(self, constraints, table): sql = [] for name, constraint in constraints.items(): sql.append( - getattr(self, f"get_{constraint.constraint_type}_constraint_string")().format( + getattr( + self, f"get_{constraint.constraint_type}_constraint_string" + )().format( columns=", ".join(constraint._columns), name_columns="_".join(constraint._columns), constraint_name=constraint.name, @@ -280,9 +319,7 @@ def alter_format(self): return "ALTER TABLE {table} {columns}" def get_foreign_key_constraint_string(self): - return ( - "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" - ) + return "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" def get_primary_key_constraint_string(self): return "CONSTRAINT {constraint_name} PRIMARY KEY ({columns})" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py index 4e764039..7fa9d687 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py @@ -63,7 +63,9 @@ def columnize(self, columns): sql = [] for name, column in columns.items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length(column.column_type).format( + length=column.length + ) else: length = "" @@ -74,7 +76,10 @@ def columnize(self, columns): elif column.default in self.premapped_defaults.keys(): default = self.premapped_defaults.get(column.default) elif column.default: - if isinstance(column.default, (str,)) and not column.default_is_raw: + if ( + isinstance(column.default, (str,)) + and not column.default_is_raw + ): default = f" DEFAULT '{column.default}'" else: default = f" DEFAULT {column.default}" @@ -99,8 +104,16 @@ def columnize(self, columns): constraint=constraint, nullable=self.premapped_nulls.get(column.is_null) or "", default=default, - signed=(" " + self.signed.get(column._signed) if column._signed else ""), - comment=("COMMENT '" + column.comment + "'" if column.comment else ""), + signed=( + " " + self.signed.get(column._signed) + if column._signed + else "" + ), + comment=( + "COMMENT '" + column.comment + "'" + if column.comment + else "" + ), ) .strip() ) @@ -109,18 +122,34 @@ def columnize(self, columns): def compile_create_sql(self, table, if_not_exists=False): sql = [] - table_create_format = self.create_if_not_exists_format() if if_not_exists else self.create_format() + table_create_format = ( + self.create_if_not_exists_format() + if if_not_exists + else self.create_format() + ) sql.append( table_create_format.format( table=self.get_table_string().format(table=table.name), - columns=", ".join(self.columnize(table.get_added_columns())).strip(), + columns=", ".join( + self.columnize(table.get_added_columns()) + ).strip(), constraints=( - ", " + ", ".join(self.constraintize(table.get_added_constraints(), table)) + ", " + + ", ".join( + self.constraintize( + table.get_added_constraints(), table + ) + ) if table.get_added_constraints() else "" ), foreign_keys=( - ", " + ", ".join(self.foreign_key_constraintize(table.name, table.added_foreign_keys)) + ", " + + ", ".join( + self.foreign_key_constraintize( + table.name, table.added_foreign_keys + ) + ) if table.added_foreign_keys else "" ), @@ -148,7 +177,9 @@ def compile_alter_sql(self, table): for name, column in table.get_added_columns().items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length( + column.column_type + ).format(length=column.length) else: length = "" @@ -172,16 +203,30 @@ def compile_alter_sql(self, table): add_columns.append( self.add_column_string() .format( - name=self.get_column_string().format(column=column.name), + name=self.get_column_string().format( + column=column.name + ), data_type=self.type_map.get(column.column_type, ""), column_constraint=column_constraint, length=length, constraint="PRIMARY KEY" if column.primary else "", nullable="NULL" if column.is_null else "NOT NULL", default=default, - signed=(" " + self.signed.get(column._signed) if column._signed else ""), - after=((" AFTER " + self.wrap_column(column._after)) if column._after else ""), - comment=(" COMMENT '" + column.comment + "'" if column.comment else ""), + signed=( + " " + self.signed.get(column._signed) + if column._signed + else "" + ), + after=( + (" AFTER " + self.wrap_column(column._after)) + if column._after + else "" + ), + comment=( + " COMMENT '" + column.comment + "'" + if column.comment + else "" + ), ) .strip() ) @@ -190,7 +235,9 @@ def compile_alter_sql(self, table): self.alter_format().format( table=self.wrap_table(table.name), columns=", ".join(add_columns).strip(), - comment=(f" COMMENT '{table.comment}'" if table.comment else ""), + comment=( + f" COMMENT '{table.comment}'" if table.comment else "" + ), ) ) @@ -199,7 +246,9 @@ def compile_alter_sql(self, table): for name, column in table.get_renamed_columns().items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length( + column.column_type + ).format(length=column.length) else: length = "" @@ -223,7 +272,10 @@ def compile_alter_sql(self, table): sql.append( self.alter_format().format( table=self.wrap_table(table.name), - columns=", ".join(f"MODIFY {x}" for x in self.columnize(table.changed_columns)), + columns=", ".join( + f"MODIFY {x}" + for x in self.columnize(table.changed_columns) + ), ) ) @@ -232,7 +284,9 @@ def compile_alter_sql(self, table): for name in table.get_dropped_columns(): dropped_sql.append( - self.drop_column_string().format(name=self.get_column_string().format(column=name)).strip() + self.drop_column_string() + .format(name=self.get_column_string().format(column=name)) + .strip() ) sql.append( @@ -249,13 +303,9 @@ def compile_alter_sql(self, table): ) in table.get_added_foreign_keys().items(): cascade = "" if foreign_key_constraint.delete_action: - cascade += ( - f" ON DELETE {self.foreign_key_actions.get(foreign_key_constraint.delete_action.lower())}" - ) + cascade += f" ON DELETE {self.foreign_key_actions.get(foreign_key_constraint.delete_action.lower())}" if foreign_key_constraint.update_action: - cascade += ( - f" ON UPDATE {self.foreign_key_actions.get(foreign_key_constraint.update_action.lower())}" - ) + cascade += f" ON UPDATE {self.foreign_key_actions.get(foreign_key_constraint.update_action.lower())}" sql.append( f"ALTER TABLE {self.wrap_table(table.name)} ADD " + self.get_foreign_key_constraint_string().format( @@ -271,7 +321,9 @@ def compile_alter_sql(self, table): if table.dropped_foreign_keys: constraints = table.dropped_foreign_keys for constraint in constraints: - sql.append(f"ALTER TABLE {self.wrap_table(table.name)} DROP FOREIGN KEY {constraint}") + sql.append( + f"ALTER TABLE {self.wrap_table(table.name)} DROP FOREIGN KEY {constraint}" + ) if table.added_indexes: for name, index in table.added_indexes.items(): @@ -298,14 +350,22 @@ def compile_alter_sql(self, table): f"ALTER TABLE {self.wrap_table(table.name)} ADD CONSTRAINT {constraint.name} PRIMARY KEY ({','.join(constraint._columns)})" ) - if table.removed_indexes or table.removed_unique_indexes or table.dropped_primary_keys: + if ( + table.removed_indexes + or table.removed_unique_indexes + or table.dropped_primary_keys + ): constraints = table.removed_indexes constraints += table.removed_unique_indexes constraints += table.dropped_primary_keys for constraint in constraints: - sql.append(f"ALTER TABLE {self.wrap_table(table.name)} DROP INDEX {constraint}") + sql.append( + f"ALTER TABLE {self.wrap_table(table.name)} DROP INDEX {constraint}" + ) if table.comment: - sql.append(f"ALTER TABLE {self.wrap_table(table.name)} COMMENT '{table.comment}'") + sql.append( + f"ALTER TABLE {self.wrap_table(table.name)} COMMENT '{table.comment}'" + ) return sql def add_column_string(self): @@ -327,7 +387,9 @@ def constraintize(self, constraints, table): sql = [] for name, constraint in constraints.items(): sql.append( - getattr(self, f"get_{constraint.constraint_type}_constraint_string")().format( + getattr( + self, f"get_{constraint.constraint_type}_constraint_string" + )().format( columns=", ".join(constraint._columns), name_columns="_".join(constraint._columns), table=table.name, @@ -353,9 +415,7 @@ def alter_format(self): return "ALTER TABLE {table} {columns}" def get_foreign_key_constraint_string(self): - return ( - "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" - ) + return "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" def get_primary_key_constraint_string(self): return "CONSTRAINT {constraint_name} PRIMARY KEY ({columns})" @@ -386,9 +446,7 @@ def compile_drop_table(self, table): return f"DROP TABLE {self.wrap_table(table)}" def compile_column_exists(self, table, column): - return ( - f"SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and column_name='{column}'" - ) + return f"SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and column_name='{column}'" def compile_get_all_tables(self, database, schema=None): return f"SELECT table_name FROM information_schema.tables WHERE table_schema = '{database}'" @@ -400,14 +458,18 @@ def get_current_schema(self, connection, table_name, schema=None): reversed_type_map = {v: k for k, v in self.type_map.items()} for column in result: - column_type = self.get_column_type(reversed_type_map, column["Type"].upper()) + column_type = self.get_column_type( + reversed_type_map, column["Type"].upper() + ) length = self.get_column_length(column["Type"]) default = column.get("Default") table.add_column( column["Field"], column_type, - column_python_type=Schema._type_hints_map.get(column_type, str), + column_python_type=Schema._type_hints_map.get( + column_type, str + ), default=default, length=length, ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py index 7b0cde9f..a98ddf41 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py @@ -2,6 +2,7 @@ class Platform: foreign_key_actions = { "cascade": "CASCADE", "set null": "SET NULL", + "cascade": "CASCADE", "restrict": "RESTRICT", "no action": "NO ACTION", "default": "SET DEFAULT", @@ -13,7 +14,9 @@ def columnize(self, columns): sql = [] for name, column in columns.items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length(column.column_type).format( + length=column.length + ) else: length = "" @@ -22,7 +25,10 @@ def columnize(self, columns): elif column.default in self.premapped_defaults.keys(): default = self.premapped_defaults.get(column.default) elif column.default: - if isinstance(column.default, (str,)) and not column.default_is_raw: + if ( + isinstance(column.default, (str,)) + and not column.default_is_raw + ): default = f" DEFAULT '{column.default}'" else: default = f" DEFAULT {column.default}" @@ -66,7 +72,9 @@ def foreign_key_constraintize(self, table, foreign_keys): constraint_name=foreign_key.constraint_name, table=self.wrap_table(table), foreign_table=self.wrap_table(foreign_key.foreign_table), - foreign_column=self.wrap_column(foreign_key.foreign_column), + foreign_column=self.wrap_column( + foreign_key.foreign_column + ), cascade=cascade, ) ) @@ -76,9 +84,9 @@ def constraintize(self, constraints): sql = [] for name, constraint in constraints.items(): sql.append( - getattr(self, f"get_{constraint.constraint_type}_constraint_string")().format( - columns=", ".join(constraint._columns) - ) + getattr( + self, f"get_{constraint.constraint_type}_constraint_string" + )().format(columns=", ".join(constraint._columns)) ) return sql diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py index 9e3972e9..3c4c85dd 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py @@ -75,18 +75,34 @@ class PostgresPlatform(Platform): def compile_create_sql(self, table, if_not_exists=False): sql = [] - table_create_format = self.create_if_not_exists_format() if if_not_exists else self.create_format() + table_create_format = ( + self.create_if_not_exists_format() + if if_not_exists + else self.create_format() + ) sql.append( table_create_format.format( table=self.wrap_table(table.name), - columns=", ".join(self.columnize(table.get_added_columns())).strip(), + columns=", ".join( + self.columnize(table.get_added_columns()) + ).strip(), constraints=( - ", " + ", ".join(self.constraintize(table.get_added_constraints(), table)) + ", " + + ", ".join( + self.constraintize( + table.get_added_constraints(), table + ) + ) if table.get_added_constraints() else "" ), foreign_keys=( - ", " + ", ".join(self.foreign_key_constraintize(table.name, table.added_foreign_keys)) + ", " + + ", ".join( + self.foreign_key_constraintize( + table.name, table.added_foreign_keys + ) + ) if table.added_foreign_keys else "" ), @@ -105,10 +121,14 @@ def compile_create_sql(self, table, if_not_exists=False): for name, column in table.get_added_columns().items(): if column.comment: - sql.append(f"""COMMENT ON COLUMN "{table.name}"."{name}" is '{column.comment}'""") + sql.append( + f"""COMMENT ON COLUMN "{table.name}"."{name}" is '{column.comment}'""" + ) if table.comment: - sql.append(f"""COMMENT ON TABLE "{table.name}" is '{table.comment}'""") + sql.append( + f"""COMMENT ON TABLE "{table.name}" is '{table.comment}'""" + ) return sql @@ -116,7 +136,9 @@ def columnize(self, columns): sql = [] for name, column in columns.items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length(column.column_type).format( + length=column.length + ) else: length = "" @@ -127,7 +149,10 @@ def columnize(self, columns): elif column.default in self.premapped_defaults.keys(): default = self.premapped_defaults.get(column.default) elif column.default: - if isinstance(column.default, (str,)) and not column.default_is_raw: + if ( + isinstance(column.default, (str,)) + and not column.default_is_raw + ): default = f" DEFAULT '{column.default}'" else: default = f" DEFAULT {column.default}" @@ -167,7 +192,9 @@ def compile_alter_sql(self, table): for name, column in table.get_added_columns().items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length( + column.column_type + ).format(length=column.length) else: length = "" @@ -222,7 +249,9 @@ def compile_alter_sql(self, table): for name, column in table.get_renamed_columns().items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length( + column.column_type + ).format(length=column.length) else: length = "" @@ -246,7 +275,11 @@ def compile_alter_sql(self, table): dropped_sql = [] for name in table.get_dropped_columns(): - dropped_sql.append(self.drop_column_string().format(name=self.wrap_column(name)).strip()) + dropped_sql.append( + self.drop_column_string() + .format(name=self.wrap_column(name)) + .strip() + ) sql.append( self.alter_format().format( @@ -259,6 +292,7 @@ def compile_alter_sql(self, table): changed_sql = [] for name, column in table.changed_columns.items(): + column_constraint = "" if column.column_type == "enum": values = ", ".join(f"'{x}'" for x in column.values) @@ -271,7 +305,8 @@ def compile_alter_sql(self, table): nullable="NULL" if column.is_null else "NOT NULL", length=( "(" + str(column.length) + ")" - if column.column_type not in self.types_without_lengths + if column.column_type + not in self.types_without_lengths else "" ), column_constraint=column_constraint, @@ -281,12 +316,18 @@ def compile_alter_sql(self, table): ) if column.is_null: - changed_sql.append(f"ALTER COLUMN {self.wrap_column(name)} DROP NOT NULL") + changed_sql.append( + f"ALTER COLUMN {self.wrap_column(name)} DROP NOT NULL" + ) else: - changed_sql.append(f"ALTER COLUMN {self.wrap_column(name)} SET NOT NULL") + changed_sql.append( + f"ALTER COLUMN {self.wrap_column(name)} SET NOT NULL" + ) if column.default is not None: - changed_sql.append(f"ALTER COLUMN {self.wrap_column(name)} SET DEFAULT {column.default}") + changed_sql.append( + f"ALTER COLUMN {self.wrap_column(name)} SET DEFAULT {column.default}" + ) sql.append( self.alter_format().format( @@ -301,21 +342,21 @@ def compile_alter_sql(self, table): ) in table.get_added_foreign_keys().items(): cascade = "" if foreign_key_constraint.delete_action: - cascade += ( - f" ON DELETE {self.foreign_key_actions.get(foreign_key_constraint.delete_action.lower())}" - ) + cascade += f" ON DELETE {self.foreign_key_actions.get(foreign_key_constraint.delete_action.lower())}" if foreign_key_constraint.update_action: - cascade += ( - f" ON UPDATE {self.foreign_key_actions.get(foreign_key_constraint.update_action.lower())}" - ) + cascade += f" ON UPDATE {self.foreign_key_actions.get(foreign_key_constraint.update_action.lower())}" sql.append( f"ALTER TABLE {self.wrap_table(table.name)} ADD " + self.get_foreign_key_constraint_string().format( column=self.wrap_column(column), constraint_name=foreign_key_constraint.constraint_name, table=self.wrap_table(table.name), - foreign_table=self.wrap_table(foreign_key_constraint.foreign_table), - foreign_column=self.wrap_column(foreign_key_constraint.foreign_column), + foreign_table=self.wrap_table( + foreign_key_constraint.foreign_table + ), + foreign_column=self.wrap_column( + foreign_key_constraint.foreign_column + ), cascade=cascade, ) ) @@ -325,12 +366,18 @@ def compile_alter_sql(self, table): for constraint in constraints: sql.append(f"DROP INDEX {constraint}") - if table.dropped_foreign_keys or table.removed_unique_indexes or table.dropped_primary_keys: + if ( + table.dropped_foreign_keys + or table.removed_unique_indexes + or table.dropped_primary_keys + ): constraints = table.dropped_foreign_keys constraints += table.removed_unique_indexes constraints += table.dropped_primary_keys for constraint in constraints: - sql.append(f"ALTER TABLE {self.wrap_table(table.name)} DROP CONSTRAINT {constraint}") + sql.append( + f"ALTER TABLE {self.wrap_table(table.name)} DROP CONSTRAINT {constraint}" + ) if table.added_indexes: for name, index in table.added_indexes.items(): @@ -360,7 +407,9 @@ def compile_alter_sql(self, table): ) if table.comment: - sql.append(f"""COMMENT ON TABLE {self.wrap_table(table.name)} is '{table.comment}'""") + sql.append( + f"""COMMENT ON TABLE {self.wrap_table(table.name)} is '{table.comment}'""" + ) return sql @@ -389,7 +438,9 @@ def constraintize(self, constraints, table): sql = [] for name, constraint in constraints.items(): sql.append( - getattr(self, f"get_{constraint.constraint_type}_constraint_string")().format( + getattr( + self, f"get_{constraint.constraint_type}_constraint_string" + )().format( columns=", ".join(constraint._columns), name_columns="_".join(constraint._columns), constraint_name=constraint.name, @@ -405,9 +456,7 @@ def create_if_not_exists_format(self): return "CREATE TABLE IF NOT EXISTS {table} ({columns}{constraints}{foreign_keys})" def get_foreign_key_constraint_string(self): - return ( - "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" - ) + return "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" def get_primary_key_constraint_string(self): return "CONSTRAINT {constraint_name} PRIMARY KEY ({columns})" @@ -447,15 +496,15 @@ def compile_drop_table(self, table): return f"DROP TABLE {self.wrap_table(table)} CASCADE" def compile_column_exists(self, table, column): - return ( - f"SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and column_name='{column}'" - ) + return f"SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and column_name='{column}'" def compile_get_all_tables(self, database=None, schema=None): return f"SELECT table_name FROM information_schema.tables WHERE table_schema = '{schema or 'public'}' AND table_catalog = '{database}' AND table_type = 'BASE TABLE'" def get_current_schema(self, connection, table_name, schema=None): - sql = self.table_information_string().format(table=table_name, schema=schema or "public") + sql = self.table_information_string().format( + table=table_name, schema=schema or "public" + ) reversed_type_map = {v: k for k, v in self.type_map.items()} reversed_type_map.update(self.table_info_map) @@ -476,7 +525,9 @@ def get_current_schema(self, connection, table_name, schema=None): length = None # find default - default = column.get("dflt_value", "") or column.get("column_default", "") + default = column.get("dflt_value", "") or column.get( + "column_default", "" + ) if default and default.startswith("nextval"): table.set_primary_key(column["column_name"]) default = None @@ -485,7 +536,9 @@ def get_current_schema(self, connection, table_name, schema=None): column["column_name"], column_type, default=default, - column_python_type=Schema._type_hints_map.get(column_type, str), + column_python_type=Schema._type_hints_map.get( + column_type, str + ), length=length, ) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py index e1b26445..67175c46 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py @@ -65,18 +65,32 @@ class SQLitePlatform(Platform): def compile_create_sql(self, table, if_not_exists=False): sql = [] - table_create_format = self.create_if_not_exists_format() if if_not_exists else self.create_format() + table_create_format = ( + self.create_if_not_exists_format() + if if_not_exists + else self.create_format() + ) sql.append( table_create_format.format( table=self.get_table_string().format(table=table.name).strip(), - columns=", ".join(self.columnize(table.get_added_columns())).strip(), + columns=", ".join( + self.columnize(table.get_added_columns()) + ).strip(), constraints=( - ", " + ", ".join(self.constraintize(table.get_added_constraints())) + ", " + + ", ".join( + self.constraintize(table.get_added_constraints()) + ) if table.get_added_constraints() else "" ), foreign_keys=( - ", " + ", ".join(self.foreign_key_constraintize(table.name, table.added_foreign_keys)) + ", " + + ", ".join( + self.foreign_key_constraintize( + table.name, table.added_foreign_keys + ) + ) if table.added_foreign_keys else "" ), @@ -85,7 +99,9 @@ def compile_create_sql(self, table, if_not_exists=False): if table.added_indexes: for name, index in table.added_indexes.items(): - sql.append(f"CREATE INDEX {index.name} ON {self.wrap_table(table.name)}({','.join(index.column)})") + sql.append( + f"CREATE INDEX {index.name} ON {self.wrap_table(table.name)}({','.join(index.column)})" + ) return sql @@ -93,7 +109,9 @@ def columnize(self, columns): sql = [] for name, column in columns.items(): if column.length: - length = self.create_column_length(column.column_type).format(length=column.length) + length = self.create_column_length(column.column_type).format( + length=column.length + ) else: length = "" @@ -104,7 +122,10 @@ def columnize(self, columns): elif column.default in self.premapped_defaults.keys(): default = self.premapped_defaults.get(column.default) elif column.default: - if isinstance(column.default, (str,)) and not column.default_is_raw: + if ( + isinstance(column.default, (str,)) + and not column.default_is_raw + ): default = f" DEFAULT '{column.default}'" else: default = f" DEFAULT {column.default}" @@ -129,7 +150,8 @@ def columnize(self, columns): length=length, signed=( " " + self.signed.get(column._signed) - if column.column_type not in self.types_without_signs and column._signed + if column.column_type not in self.types_without_signs + and column._signed else "" ), constraint=constraint, @@ -183,14 +205,21 @@ def compile_alter_sql(self, diff): default=default, signed=( " " + self.signed.get(column._signed) - if column.column_type not in self.types_without_signs and column._signed + if column.column_type + not in self.types_without_signs + and column._signed else "" ), constraint=constraint, ) .strip() ) - if diff.renamed_columns or diff.dropped_columns or diff.changed_columns or diff.added_foreign_keys: + if ( + diff.renamed_columns + or diff.dropped_columns + or diff.changed_columns + or diff.added_foreign_keys + ): original_columns = diff.from_table.added_columns # pop off the dropped columns. No need for them here for column in diff.dropped_columns: @@ -199,11 +228,15 @@ def compile_alter_sql(self, diff): sql.append( "CREATE TEMPORARY TABLE __temp__{table} AS SELECT {original_column_names} FROM {table}".format( table=diff.name, - original_column_names=", ".join(diff.from_table.added_columns.keys()), + original_column_names=", ".join( + diff.from_table.added_columns.keys() + ), ) ) - sql.append("DROP TABLE {table}".format(table=self.wrap_table(diff.name))) + sql.append( + "DROP TABLE {table}".format(table=self.wrap_table(diff.name)) + ) columns = diff.from_table.added_columns @@ -213,15 +246,25 @@ def compile_alter_sql(self, diff): sql.append( self.create_format().format( - table=self.get_table_string().format(table=diff.name).strip(), + table=self.get_table_string() + .format(table=diff.name) + .strip(), columns=", ".join(self.columnize(columns)).strip(), constraints=( - ", " + ", ".join(self.constraintize(diff.get_added_constraints())) + ", " + + ", ".join( + self.constraintize(diff.get_added_constraints()) + ) if diff.get_added_constraints() else "" ), foreign_keys=( - ", " + ", ".join(self.foreign_key_constraintize(diff.name, diff.added_foreign_keys)) + ", " + + ", ".join( + self.foreign_key_constraintize( + diff.name, diff.added_foreign_keys + ) + ) if diff.added_foreign_keys else "" ), @@ -236,7 +279,9 @@ def compile_alter_sql(self, diff): quoted_table=self.wrap_table(diff.name), table=diff.name, new_columns=", ".join(self.columnize_names(columns)), - original_column_names=", ".join(diff.from_table.added_columns.keys()), + original_column_names=", ".join( + diff.from_table.added_columns.keys() + ), ) ) sql.append("DROP TABLE __temp__{table}".format(table=diff.name)) @@ -251,7 +296,9 @@ def compile_alter_sql(self, diff): if diff.added_indexes: for name, index in diff.added_indexes.items(): - sql.append(f"CREATE INDEX {index.name} ON {self.wrap_table(diff.name)}({','.join(index.column)})") + sql.append( + f"CREATE INDEX {index.name} ON {self.wrap_table(diff.name)}({','.join(index.column)})" + ) if diff.added_constraints: for name, constraint in diff.added_constraints.items(): if constraint.constraint_type == "unique": @@ -292,9 +339,7 @@ def get_unique_constraint_string(self): return "UNIQUE({columns})" def get_foreign_key_constraint_string(self): - return ( - "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" - ) + return "CONSTRAINT {constraint_name} FOREIGN KEY ({column}) REFERENCES {foreign_table}({foreign_column}){cascade}" def get_primary_key_constraint_string(self): return "CONSTRAINT {constraint_name} PRIMARY KEY ({columns})" @@ -303,7 +348,9 @@ def constraintize(self, constraints): sql = [] for name, constraint in constraints.items(): sql.append( - getattr(self, f"get_{constraint.constraint_type}_constraint_string")().format( + getattr( + self, f"get_{constraint.constraint_type}_constraint_string" + )().format( columns=", ".join(constraint.columns), constraint_name=constraint.name, ) @@ -324,7 +371,9 @@ def foreign_key_constraintize(self, table, foreign_keys): constraint_name=foreign_key.constraint_name, table=self.wrap_table(table), foreign_table=self.wrap_table(foreign_key.foreign_table), - foreign_column=self.wrap_column(foreign_key.foreign_column), + foreign_column=self.wrap_column( + foreign_key.foreign_column + ), cascade=cascade, ) ) @@ -345,7 +394,9 @@ def get_current_schema(self, connection, table_name, schema=None): result = connection.query(sql, ()) for column in result: - column_type = self.get_column_type(reversed_type_map, column["type"].upper()) + column_type = self.get_column_type( + reversed_type_map, column["type"].upper() + ) length = self.get_column_length(column["type"]) # find default @@ -356,7 +407,9 @@ def get_current_schema(self, connection, table_name, schema=None): table.add_column( column["name"], column_type, - column_python_type=Schema._type_hints_map.get(column_type, str), + column_python_type=Schema._type_hints_map.get( + column_type, str + ), default=default, length=length, nullable=int(column.get("notnull")) == 0, @@ -397,9 +450,7 @@ def compile_table_exists(self, table, database=None, schema=None): return f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table}'" def compile_column_exists(self, table, column): - return ( - f"SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and column_name='{column}'" - ) + return f"SELECT column_name FROM information_schema.columns WHERE table_name='{table}' and column_name='{column}'" def compile_get_all_tables(self, database, schema=None): return "SELECT name FROM sqlite_master WHERE type='table'" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/schema.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/schema.py index 87143e8c..7dd1ee0d 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/schema.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/schema/schema.py @@ -22,6 +22,7 @@ def get_connection(self): def platform(self): return self.get_connection().get_default_platform()() + async def create(self, table: str) -> Blueprint: """Return a Blueprint for a new table (async context manager).""" connection = self.get_connection() diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py index a555850c..5872464f 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/seeds/Seeder.py @@ -2,7 +2,9 @@ class Seeder: - def __init__(self, seed_path="databases/seeds", connection=None): + def __init__( + self, seed_path="databases/seeds", connection=None + ): self.ran_seeds = [] self.seed_path = seed_path self.connection = connection @@ -14,10 +16,12 @@ async def call(self, *seeder_classes): await seeder_class(connection=self.connection).run() async def run_database_seed(self): - database_seeder = pydoc.locate(f"{self.seed_module}.database_seeder.DatabaseSeeder") + database_seeder = pydoc.locate( + f"{self.seed_module}.database_seeder.DatabaseSeeder" + ) if not database_seeder: - raise ValueError(f"Could not find the DatabaseSeeder class in {self.seed_module}.database_seeder") + raise ValueError(f"Could not find the DatabaseSeeder class in {self.seed_module}.database_seeder") self.ran_seeds.append(database_seeder) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/db.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/db.py index e7716c23..eb1d0dd9 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/db.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/db.py @@ -2,15 +2,12 @@ from fastapi_startkit.orm.connections.manager import DatabaseManager from fastapi_startkit.orm.models.model import Model -DB = DatabaseManager( - ConnectionFactory(), - { - "default": "sqlite", - "sqlite": { - "driver": "sqlite", - "url": "sqlite+aiosqlite:///masonite.sqlite3", - }, - }, -) +DB = DatabaseManager(ConnectionFactory(), { + "default": "sqlite", + "sqlite": { + "driver": "sqlite", + "url": "sqlite+aiosqlite:///masonite.sqlite3", + } +}) Model.db_manager = DB diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/factory.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/factory.py index 8f88f782..0763588c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/factory.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/factory.py @@ -1,10 +1,13 @@ -from fastapi_startkit.orm.factory.factory import Factory +import faker +from fastapi_startkit.orm.factory.factory import Factory from .model import User - class UserFactory(Factory): model = User - def definition(self) -> dict: - return {"name": "Alex", "email": "tmgbedu@gmail.com"} + def definition(self)->dict: + return { + "name": "Alex", + "email": "tmgbedu@gmail.com" + } diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/migration.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/migration.py index 39839b0f..6ca0f43c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/migration.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/migration.py @@ -2,61 +2,60 @@ schema = DB.get_schema_builder() - async def wipe(): - tables = await schema.on("default").get_all_tables() + tables = await schema.on('default').get_all_tables() for table in tables: - await schema.on("default").drop_table_if_exists(table) - + await schema.on('default').drop_table_if_exists(table) async def migrate(): - async with await schema.on("default").create_table_if_not_exists("users") as table: + async with (await schema.on('default').create_table_if_not_exists("users") as table): table.id() table.string("name") table.string("email").unique() table.boolean("is_admin").default(False) - table.timestamp("email_verified_at").nullable() + table.timestamp('email_verified_at').nullable() table.timestamps() - async with await schema.create_table_if_not_exists("profiles") as table: + async with (await schema.create_table_if_not_exists("profiles")) as table: table.integer("id").primary() table.string("name") table.integer("user_id") - async with await schema.create_table_if_not_exists("articles") as table: + async with (await schema.create_table_if_not_exists("articles")) as table: table.id() table.string("title") table.integer("user_id") table.datetime("published_date") - async with await schema.create_table_if_not_exists("logos") as table: + async with (await schema.create_table_if_not_exists("logos")) as table: table.id() table.integer("article_id") table.datetime("published_date") - async with await schema.create_table_if_not_exists("users") as table: + async with (await schema.create_table_if_not_exists("users")) as table: table.id() table.string("name") table.boolean("is_admin").default(False) table.datetime("created_at") table.datetime("updated_at") - async with await schema.create_table_if_not_exists("stores") as table: + async with (await schema.create_table_if_not_exists("stores")) as table: table.integer("id").primary() table.string("name") - async with await schema.create_table_if_not_exists("products") as table: + async with (await schema.create_table_if_not_exists("products")) as table: table.id() table.string("name") table.timestamps() - async with await schema.create_table_if_not_exists("product_table") as table: + async with (await schema.create_table_if_not_exists("product_table")) as table: table.id() table.integer("store_id") table.integer("product_id") - async with await schema.create_table_if_not_exists("product_store") as table: + async with (await schema.create_table_if_not_exists("product_store")) as table: table.id() table.integer("store_id") table.integer("product_id") table.timestamps() + diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/model.py index cc10d45a..83b3ee30 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/model.py @@ -1,9 +1,8 @@ -from fastapi_startkit.orm.models.model import Model - from fastapi_startkit.carbon.carbon import Carbon from fastapi_startkit.masoniteorm import Field from fastapi_startkit.masoniteorm.models.fields import DateTimeField -from fastapi_startkit.masoniteorm.relationships import BelongsTo, BelongsToMany, HasMany, HasOne +from fastapi_startkit.masoniteorm.relationships import HasOne, BelongsTo, HasMany, BelongsToMany +from fastapi_startkit.orm.models.model import Model class User(Model): @@ -13,10 +12,10 @@ class User(Model): email_verified_at: Carbon = DateTimeField(fmt="%Y-%m-%d %H:%M:%S", tz="UTC") is_admin: bool - profile: "Profile" = HasOne("Profile", "user_id", "id") - articles: "Articles" = HasMany("Articles", "id", "user_id") + profile: 'Profile' = HasOne("Profile", "user_id", "id") + articles: 'Articles' = HasMany("Articles", "id", "user_id") - def get_is_admin(self) -> bool: + def get_is_admin(self)->bool: return self.is_admin @@ -37,14 +36,12 @@ class Articles(Model): __timestamps__ = None published_date: Carbon = Field(json_schema_extra={"format": "YYYY-MM-DD HH:mm:ss"}) - logo: "Logo" = BelongsTo("Logo", "id", "article_id") - + logo: 'Logo' = BelongsTo('Logo', "id", "article_id") class Store(Model): - products: "Product" = BelongsToMany("Product", "store_id", "product_id", "id", "id", with_timestamps=True) - products_table: "Product" = BelongsToMany("Product", "store_id", "product_id", "id", "id", table="product_table") - store_products: "Product" = BelongsToMany("Product") - + products: 'Product' = BelongsToMany("Product", "store_id", "product_id", "id", "id", with_timestamps=True) + products_table: 'Product' = BelongsToMany("Product", "store_id", "product_id", "id", "id", table="product_table") + store_products: 'Product' = BelongsToMany("Product") class Product(Model): __table__ = "products" diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/seeder.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/seeder.py index 6344108c..55e6e126 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/seeder.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/fixtures/seeder.py @@ -1,10 +1,8 @@ -from .model import Articles, Logo, Profile, User +from .model import User, Profile, Articles, Logo async def seeder(): - user = await User.query().create({"email": "admin@admin.com", "name": "Joe", "is_admin": True}) + user = await User.query().create({"email":"admin@admin.com", "name": "Joe", "is_admin": True}) await Profile.create({"name": "Joe Profile", "user_id": user.id}) - article = await Articles.create( - {"title": "Masonite ORM", "user_id": user.id, "published_date": "2020-01-01 00:00:00"} - ) + article = await Articles.create({"title": "Masonite ORM", "user_id": user.id, "published_date": "2020-01-01 00:00:00"}) await Logo.create({"article_id": article.id, "published_date": "2020-01-01 00:00:00"}) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model.py index 7b61ca5c..4e47cdf4 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model.py @@ -1,10 +1,10 @@ import pytest -from fastapi_startkit.orm.connections.factory import ConnectionFactory -from fastapi_startkit.orm.connections.manager import DatabaseManager -from fastapi_startkit.orm.models.model import Model from fastapi_startkit.carbon import Carbon from fastapi_startkit.masoniteorm.models.fields import DateTimeField +from fastapi_startkit.orm.connections.factory import ConnectionFactory +from fastapi_startkit.orm.connections.manager import DatabaseManager +from fastapi_startkit.orm.models.model import Model # --------------------------------------------------------------------------- # Shared fixtures @@ -55,7 +55,6 @@ async def users_table(db): # Schema # --------------------------------------------------------------------------- - class TestSchema: async def test_create_table(self, db, users_table): schema = db.get_schema_builder() @@ -76,7 +75,6 @@ async def test_drop_table_removes_table(self, db, users_table): # INSERT (Model.save on a new record) # --------------------------------------------------------------------------- - class TestModelInsert: async def test_save_inserts_row(self, UserModel, users_table): user = UserModel(name="Alex", email="alex@gmail.com") @@ -119,7 +117,6 @@ async def test_save_with_datetime_field(self, UserModel, users_table): # UPDATE (Model.save on an existing record) # --------------------------------------------------------------------------- - class TestModelUpdate: async def test_save_updates_dirty_attribute(self, UserModel, users_table): user = UserModel(name="Alex", email="alex@gmail.com") diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model_attributes.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model_attributes.py index ea9d5ea2..cdf06549 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model_attributes.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/models/test_model_attributes.py @@ -1,13 +1,13 @@ -from unittest.mock import MagicMock, patch - import pendulum import pytest +from unittest.mock import MagicMock, patch + +from fastapi_startkit.carbon import Carbon +from fastapi_startkit.masoniteorm.models.fields import DateTimeField from fastapi_startkit.orm.connections.factory import ConnectionFactory from fastapi_startkit.orm.connections.manager import DatabaseManager from fastapi_startkit.orm.models.model import Model -from fastapi_startkit.carbon import Carbon -from fastapi_startkit.masoniteorm.models.fields import DateTimeField # --------------------------------------------------------------------------- # Shared fixtures @@ -43,30 +43,26 @@ class User(Model): # DatabaseManager / ConnectionFactory # --------------------------------------------------------------------------- - class TestConnectionFactory: def test_build_url_uses_explicit_url(self): url = ConnectionFactory.build_url({"driver": "sqlite", "url": "sqlite+aiosqlite:///test.db"}) assert url == "sqlite+aiosqlite:///test.db" def test_build_url_constructs_from_parts(self): - url = ConnectionFactory.build_url( - { - "driver": "postgres", - "username": "user", - "password": "pass", - "host": "localhost", - "port": "5432", - "database": "mydb", - } - ) + url = ConnectionFactory.build_url({ + "driver": "postgres", + "username": "user", + "password": "pass", + "host": "localhost", + "port": "5432", + "database": "mydb", + }) assert url == "postgresql+asyncpg://user:pass@localhost:5432/mydb" def test_make_returns_sqlite_connection(self): factory = ConnectionFactory() conn = factory.make(SQLITE_CONFIG["sqlite"], "sqlite") from fastapi_startkit.orm.connections.sqlite_connection import SQliteConnection - assert isinstance(conn, SQliteConnection) @@ -99,7 +95,6 @@ def test_connection_raises_for_missing_driver(self): # Model attribute access # --------------------------------------------------------------------------- - class TestModelAttributes: def test_name_attribute(self, UserModel): user = UserModel(name="Alex", email="alex@gmail.com") @@ -130,7 +125,6 @@ def test_unknown_attribute_returns_none(self, UserModel): # DateTimeField casting # --------------------------------------------------------------------------- - class TestDateTimeField: def test_email_verified_at_is_pendulum_datetime(self, UserModel): user = UserModel( @@ -157,7 +151,6 @@ def test_email_verified_at_none_when_not_set(self, UserModel): # created_at / updated_at (observer-driven timestamps) # --------------------------------------------------------------------------- - class TestTimestampFields: def test_created_at_is_none_before_save(self, UserModel): """created_at is populated by the CreatedAtObserver on the 'creating' event, @@ -180,15 +173,14 @@ def test_observers_are_registered_on_model(self, UserModel): # query() returns a QueryBuilder # --------------------------------------------------------------------------- - class TestModelQuery: def test_query_returns_query_builder(self, UserModel): from fastapi_startkit.orm.models.builder import QueryBuilder - builder = UserModel.query() assert isinstance(builder, QueryBuilder) def test_query_builder_has_model_set(self, UserModel): + from fastapi_startkit.orm.models.builder import QueryBuilder builder = UserModel.query() assert builder._model is not None - assert isinstance(builder._model, UserModel) + assert isinstance(builder._model, UserModel) \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/models/test_sqlite_model.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/models/test_sqlite_model.py index 128db293..06ea04f7 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/models/test_sqlite_model.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/models/test_sqlite_model.py @@ -18,7 +18,7 @@ async def test_update_specific_record(self): sql, bindings = mock_update.call_args[0] self.assertEqual(sql, 'UPDATE "users" SET "name" = ? WHERE "id" = ?') - self.assertEqual(bindings, ["joe", 1]) + self.assertEqual(bindings, ['joe', 1]) async def test_update_all_records(self): mock_update = AsyncMock(return_value=1) @@ -30,7 +30,7 @@ async def test_update_all_records(self): sql, bindings = mock_update.call_args[0] self.assertEqual(sql, 'UPDATE "users" SET "name" = ?') - self.assertEqual(bindings, ["joe"]) + self.assertEqual(bindings, ['joe']) async def test_can_find_list(self): mock_select = AsyncMock(return_value=[]) @@ -59,7 +59,7 @@ async def test_update_only_changed_attributes(self): sql, bindings = mock_update.call_args[0] self.assertEqual(sql, 'UPDATE "users" SET "name" = ? WHERE "id" = ?') - self.assertEqual(bindings, ["new_name", 1]) + self.assertEqual(bindings, ['new_name', 1]) @unittest.skip("find() not yet implemented") async def test_can_find_list(self): diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/relationships/test_sqlite_relationships.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/relationships/test_sqlite_relationships.py index 221c4715..ca3b59bf 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/relationships/test_sqlite_relationships.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/relationships/test_sqlite_relationships.py @@ -1,4 +1,5 @@ -from fastapi_startkit.orm.tests.fixtures.model import Profile, User +from fastapi_startkit.orm.tests.fixtures.model import Profile +from fastapi_startkit.orm.tests.fixtures.model import User from fastapi_startkit.orm.tests.sqlite.test_case import TestCase @@ -9,7 +10,7 @@ async def test_can_access_relationship(self): self.assertIsInstance(profile, Profile) async def test_can_access_has_many_relationship(self): - user = await User.where("email", "admin@admin.com").first() + user = await User.where('email', 'admin@admin.com').first() articles = await user.articles self.assertEqual(len(articles), 1) @@ -21,7 +22,7 @@ async def test_can_access_relationship_multiple_times(self): self.assertEqual(len(articles), 1) async def test_can_access_relationship_date(self): - user = await User.with_("articles").where("email", "admin@admin.com").first() + user = await User.with_("articles").where("email", 'admin@admin.com').first() for article in user.articles: logo = await article.logo self.assertTrue(logo.published_date) diff --git a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/test_case.py b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/test_case.py index 0058ab1e..1128fa0c 100644 --- a/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/test_case.py +++ b/fastapi_startkit/src/fastapi_startkit/masoniteorm/tests/sqlite/test_case.py @@ -16,5 +16,5 @@ async def asyncSetUp(self): async def asyncTearDown(self): await self.rollback() - async def rollback(self) -> None: + async def rollback(self)-> None: await wipe() diff --git a/fastapi_startkit/src/fastapi_startkit/providers/Provider.py b/fastapi_startkit/src/fastapi_startkit/providers/Provider.py index e7c2e3d3..c3e99f26 100644 --- a/fastapi_startkit/src/fastapi_startkit/providers/Provider.py +++ b/fastapi_startkit/src/fastapi_startkit/providers/Provider.py @@ -1,8 +1,10 @@ -from typing import TYPE_CHECKING +import dataclasses +from typing import TYPE_CHECKING, Any -from fastapi_startkit.helpers.dataclass import Dataclass from fastapi_startkit.helpers.string import Str +from fastapi_startkit.helpers.dataclass import Dataclass + if TYPE_CHECKING: from ..application import Application @@ -10,12 +12,17 @@ class Provider: provider_key: str = None - def __init__(self, application: "Application", config: dict = None): - self.app: "Application" = application + def __init__(self, application: 'Application', config: dict = None): + self.app: 'Application' = application self.config = config or {} if self.provider_key is None: - self.provider_key = str(Str.of(self.__class__.__name__).trim("ServiceProvider").trim("Provider").slugify()) + self.provider_key = str( + Str.of(self.__class__.__name__) + .trim('ServiceProvider') + .trim('Provider') + .slugify() + ) def register(self) -> None: pass @@ -30,7 +37,7 @@ def resolve_config(self, default) -> dict: return {**default_config, **user_config} def merge_config_from(self, source: str | dict, provider_key: str) -> None: - self.app.make("config").merge_with(provider_key, source) + self.app.make('config').merge_with(provider_key, source) def publishes(self, resources: dict, tag: str = None) -> None: self.app.published_resources.setdefault(self.provider_key, {}).update(resources) diff --git a/fastapi_startkit/src/fastapi_startkit/providers/app_provider.py b/fastapi_startkit/src/fastapi_startkit/providers/app_provider.py index f809e81c..462d28ba 100644 --- a/fastapi_startkit/src/fastapi_startkit/providers/app_provider.py +++ b/fastapi_startkit/src/fastapi_startkit/providers/app_provider.py @@ -7,4 +7,6 @@ def register(self) -> None: pass def boot(self) -> None: - self.commands([PublishCommand]) + self.commands([ + PublishCommand + ]) diff --git a/fastapi_startkit/src/fastapi_startkit/tests/configurations/test_config_merge.py b/fastapi_startkit/src/fastapi_startkit/tests/configurations/test_config_merge.py index dd1efff8..1dfaca86 100644 --- a/fastapi_startkit/src/fastapi_startkit/tests/configurations/test_config_merge.py +++ b/fastapi_startkit/src/fastapi_startkit/tests/configurations/test_config_merge.py @@ -1,7 +1,6 @@ from unittest.mock import MagicMock, patch - from fastapi_startkits.configuration import Configuration - +from fastapi_startkits.loader import Loader class TestConfiguration: def test_merge_with_dict(self): @@ -10,21 +9,21 @@ def test_merge_with_dict(self): config = Configuration(app) # Set up the existing config - config.set("testkey", {"existing_key": "existing_value"}) + config.set('testkey', {'existing_key': 'existing_value'}) # Dictionary to merge (defaults) - defaults = {"new_key": "new_value", "existing_key": "default_value"} + defaults = {'new_key': 'new_value', 'existing_key': 'default_value'} # Act - config.merge_with("testkey", defaults) + config.merge_with('testkey', defaults) # Assert - merged = config.get("testkey") + merged = config.get('testkey') # New keys should be added - assert merged["new_key"] == "new_value" + assert merged['new_key'] == 'new_value' # Existing keys should be PRESERVED (Low Priority behavior of merge_with) # {**base_config, **self.get(path, {})} -> Existing overwrites base - assert merged["existing_key"] == "existing_value" + assert merged['existing_key'] == 'existing_value' def test_merge_with_file_path(self): """Test merge_with accepts a file path, loads it, and merges as defaults.""" @@ -32,21 +31,24 @@ def test_merge_with_file_path(self): config = Configuration(app) # Setup - config.set("testkey", {"existing": "orig"}) + config.set('testkey', {'existing': 'orig'}) # Mock Loader to return params from file - with patch("fastapi_startkit.configuration.Configuration.Loader") as MockLoaderClass: + with patch('fastapi_startkit.configuration.Configuration.Loader') as MockLoaderClass: mock_loader = MockLoaderClass.return_value - mock_loader.get_parameters.return_value = {"New": "from_file", "Existing": "default_from_file"} + mock_loader.get_parameters.return_value = { + 'New': 'from_file', + 'Existing': 'default_from_file' + } # Act - config.merge_with("testkey", "/path/to/config.py") + config.merge_with('testkey', '/path/to/config.py') # Assert - mock_loader.get_parameters.assert_called_once_with("/path/to/config.py") + mock_loader.get_parameters.assert_called_once_with('/path/to/config.py') - merged = config.get("testkey") + merged = config.get('testkey') # Keys are lowercased by merge_with logic: {name.lower(): value ...} - assert merged["new"] == "from_file" + assert merged['new'] == 'from_file' # Existing check - assert merged["existing"] == "orig" + assert merged['existing'] == 'orig' diff --git a/fastapi_startkit/src/fastapi_startkit/tests/test_case.py b/fastapi_startkit/src/fastapi_startkit/tests/test_case.py index 2edabdd2..04432b91 100644 --- a/fastapi_startkit/src/fastapi_startkit/tests/test_case.py +++ b/fastapi_startkit/src/fastapi_startkit/tests/test_case.py @@ -3,9 +3,8 @@ class TestCase(unittest.TestCase): def setUp(self): - from fastapi.testclient import TestClient - from fastapi_startkit.application import app + from fastapi.testclient import TestClient self.client = TestClient(app()) diff --git a/fastapi_startkit/src/fastapi_startkit/utils/collections.py b/fastapi_startkit/src/fastapi_startkit/utils/collections.py index be56db12..441f552f 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/collections.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/collections.py @@ -1,8 +1,7 @@ import json -import operator import random +import operator from functools import reduce - from dotty_dict import Dotty from .structures import data_get @@ -251,7 +250,9 @@ def pluck(self, value, key=None): for k, v in iterable: if k == value: if key: - attributes[self._data_get(item, key)] = self._data_get(item, value) + attributes[self._data_get(item, key)] = self._data_get( + item, value + ) else: attributes.append(v) diff --git a/fastapi_startkit/src/fastapi_startkit/utils/filesystem.py b/fastapi_startkit/src/fastapi_startkit/utils/filesystem.py index 625c93e1..b433fd7f 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/filesystem.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/filesystem.py @@ -1,7 +1,7 @@ -import mimetypes import os -import pathlib import platform +import pathlib +import mimetypes def make_directory(directory): diff --git a/fastapi_startkit/src/fastapi_startkit/utils/http.py b/fastapi_startkit/src/fastapi_startkit/utils/http.py index 06e1e1d0..10136fcb 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/http.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/http.py @@ -1,5 +1,6 @@ """Helpers for working with HTTP.""" + HTTP_STATUS_CODES = { 100: "100 Continue", 101: "101 Switching Protocol", diff --git a/fastapi_startkit/src/fastapi_startkit/utils/location.py b/fastapi_startkit/src/fastapi_startkit/utils/location.py index 6fff2907..70ae75e7 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/location.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/location.py @@ -1,7 +1,6 @@ """Helpers to resolve absolute paths to the different app resources using a configured location.""" - -from os.path import abspath, join +from os.path import join, abspath from .str import as_filepath diff --git a/fastapi_startkit/src/fastapi_startkit/utils/str.py b/fastapi_startkit/src/fastapi_startkit/utils/str.py index 6e494d77..e6c3db32 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/str.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/str.py @@ -2,8 +2,8 @@ import random import string -from typing import Any from urllib import parse +from typing import Any def random_string(length=4): @@ -15,7 +15,9 @@ def random_string(length=4): Returns: string """ - return "".join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length)) + return "".join( + random.choice(string.ascii_uppercase + string.digits) for _ in range(length) + ) def modularize(file_path, suffix=".py"): @@ -79,7 +81,9 @@ def add_query_params(url: str, query_params: dict) -> str: """Add query params dict to a given url (which can already contain some query parameters).""" path_result = parse.urlsplit(url) - base_url = f"{path_result.scheme}://{path_result.hostname}" if path_result.hostname else "" + base_url = ( + f"{path_result.scheme}://{path_result.hostname}" if path_result.hostname else "" + ) base_path = path_result.path # parse existing query parameters if any diff --git a/fastapi_startkit/src/fastapi_startkit/utils/structures.py b/fastapi_startkit/src/fastapi_startkit/utils/structures.py index 5192e344..4bfddc2a 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/structures.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/structures.py @@ -1,11 +1,13 @@ """Helpers for multiple data structures""" import importlib - +from importlib.abc import Loader from dotty_dict import dotty from ..exceptions.exceptions import LoaderNotFound +from .str import modularize + def load(path, object_name=None, default=None, raise_exception=False): """Load the given object from a Python module located at path and returns a default @@ -19,12 +21,14 @@ def load(path, object_name=None, default=None, raise_exception=False): {object} -- The value (or default) read in the module or the module if no object name """ try: - name = path.split("/")[-1].replace(".py", "") if "/" in path else path.replace(".py", "") + name = path.split('/')[-1].replace('.py', '') if '/' in path else path.replace('.py', '') spec = importlib.util.spec_from_file_location(name, path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) except Exception as e: - error_message = f"'{path}' error when loading from file: {str(e)}" + error_message = ( + f"'{path}' error when loading from file: {str(e)}" + ) print("Warning: " + error_message) if raise_exception: raise LoaderNotFound(error_message) diff --git a/fastapi_startkit/src/fastapi_startkit/utils/time.py b/fastapi_startkit/src/fastapi_startkit/utils/time.py index ed91cc27..ecbf7cc3 100644 --- a/fastapi_startkit/src/fastapi_startkit/utils/time.py +++ b/fastapi_startkit/src/fastapi_startkit/utils/time.py @@ -1,5 +1,4 @@ """Time related helpers""" - import pendulum diff --git a/fastapi_startkit/src/fastapi_startkit/vite/__init__.py b/fastapi_startkit/src/fastapi_startkit/vite/__init__.py index 8acf44ee..c6c8cf31 100644 --- a/fastapi_startkit/src/fastapi_startkit/vite/__init__.py +++ b/fastapi_startkit/src/fastapi_startkit/vite/__init__.py @@ -1,6 +1,6 @@ -from .exceptions import ViteException, ViteManifestNotFoundException -from .providers.provider import ViteProvider from .vite import Vite +from .providers.provider import ViteProvider +from .exceptions import ViteException, ViteManifestNotFoundException __all__ = [ "Vite", diff --git a/fastapi_startkit/src/fastapi_startkit/vite/config/vite.py b/fastapi_startkit/src/fastapi_startkit/vite/config/vite.py index 71431700..15de0153 100644 --- a/fastapi_startkit/src/fastapi_startkit/vite/config/vite.py +++ b/fastapi_startkit/src/fastapi_startkit/vite/config/vite.py @@ -10,3 +10,7 @@ class ViteConfig: asset_url: str = "" static_url: str = "/build" mount_static: bool = True + + + + diff --git a/fastapi_startkit/src/fastapi_startkit/vite/exceptions.py b/fastapi_startkit/src/fastapi_startkit/vite/exceptions.py index e03a600f..1f18d9ad 100644 --- a/fastapi_startkit/src/fastapi_startkit/vite/exceptions.py +++ b/fastapi_startkit/src/fastapi_startkit/vite/exceptions.py @@ -3,4 +3,4 @@ class ViteException(Exception): class ViteManifestNotFoundException(ViteException): - pass + pass \ No newline at end of file diff --git a/fastapi_startkit/src/fastapi_startkit/vite/providers/provider.py b/fastapi_startkit/src/fastapi_startkit/vite/providers/provider.py index 36a6f9c9..58bc9a5a 100644 --- a/fastapi_startkit/src/fastapi_startkit/vite/providers/provider.py +++ b/fastapi_startkit/src/fastapi_startkit/vite/providers/provider.py @@ -1,11 +1,10 @@ import os -from pathlib import Path -from starlette.templating import Jinja2Templates +from dumpdie import dd from fastapi_startkit.providers import Provider - from ..config.vite import ViteConfig + from ..vite import Vite @@ -14,15 +13,9 @@ class ViteProvider(Provider): def register(self) -> None: from ..config.vite import ViteConfig - config = self.resolve_config(ViteConfig) self.merge_config_from(config, self.provider_key) - # Bind Jinja2Templates so ViteProvider can inject vite() globals into it. - templates_dir = Path(self.app.base_path) / "templates" - templates = Jinja2Templates(directory=str(templates_dir)) - self.app.bind("templates", templates) - config = ViteConfig(**config) vite = Vite( @@ -35,6 +28,7 @@ def register(self) -> None: self.app.bind("vite", vite) + def boot(self) -> None: vite: Vite = self.app.make("vite") config = self.app.make("config").get(self.provider_key) @@ -44,7 +38,9 @@ def boot(self) -> None: self.register_jinja_directives(vite) source = os.path.abspath(str(os.path.join(str(os.path.dirname(__file__)), "../config/vite.py"))) - self.publishes({source: "config/vite.py"}) + self.publishes({ + source: 'config/vite.py' + }) def mount_static_file_if_require(self, config: ViteConfig): if config.mount_static: diff --git a/fastapi_startkit/src/fastapi_startkit/vite/vite.py b/fastapi_startkit/src/fastapi_startkit/vite/vite.py index 5232e240..2994213b 100644 --- a/fastapi_startkit/src/fastapi_startkit/vite/vite.py +++ b/fastapi_startkit/src/fastapi_startkit/vite/vite.py @@ -5,6 +5,8 @@ import secrets from typing import Callable, Optional +from dumpdie import dd + from .exceptions import ViteException, ViteManifestNotFoundException @@ -116,7 +118,9 @@ def __call__( if self.is_running_hot(): hot_origin = self._read_hot_origin() - tags = [self._make_tag_for_chunk("@vite/client", f"{hot_origin}/@vite/client", None, None)] + tags = [ + self._make_tag_for_chunk("@vite/client", f"{hot_origin}/@vite/client", None, None) + ] for ep in entrypoints: tags.append(self._make_tag_for_chunk(ep, f"{hot_origin}/{ep}", None, None)) return "".join(tags) @@ -129,25 +133,21 @@ def __call__( for entrypoint in entrypoints: chunk = self._chunk(manifest, entrypoint) - preloads.append( - ( - chunk.get("src", entrypoint), - self._asset_path(f"{build_directory}/{chunk['file']}"), - chunk, - manifest, - ) - ) + preloads.append(( + chunk.get("src", entrypoint), + self._asset_path(f"{build_directory}/{chunk['file']}"), + chunk, + manifest, + )) for import_key in self._resolve_imports(manifest, chunk): import_chunk = manifest[import_key] - preloads.append( - ( - import_key, - self._asset_path(f"{build_directory}/{import_chunk['file']}"), - import_chunk, - manifest, - ) - ) + preloads.append(( + import_key, + self._asset_path(f"{build_directory}/{import_chunk['file']}"), + import_chunk, + manifest, + )) for css in import_chunk.get("css", []): url = self._asset_path(f"{build_directory}/{css}") @@ -156,14 +156,12 @@ def __call__( preloads.append((src, url, css_chunk, manifest)) tags.append(self._make_tag_for_chunk(src, url, css_chunk, manifest)) - tags.append( - self._make_tag_for_chunk( - entrypoint, - self._asset_path(f"{build_directory}/{chunk['file']}"), - chunk, - manifest, - ) - ) + tags.append(self._make_tag_for_chunk( + entrypoint, + self._asset_path(f"{build_directory}/{chunk['file']}"), + chunk, + manifest, + )) for css in chunk.get("css", []): url = self._asset_path(f"{build_directory}/{css}") @@ -217,7 +215,7 @@ def react_refresh(self) -> str: hot_url = f"{self._read_hot_origin()}/@react-refresh" return ( - f'" + attrs = self._parse_attributes({ + "type": "module", + "src": url, + "nonce": self._nonce or False, + **attributes, + }) + return f'' def _make_stylesheet_tag_with_attributes(self, url: str, attributes: dict) -> str: - attrs = self._parse_attributes( - { - "rel": "stylesheet", - "href": url, - "nonce": self._nonce or False, - **attributes, - } - ) - return f"" + attrs = self._parse_attributes({ + "rel": "stylesheet", + "href": url, + "nonce": self._nonce or False, + **attributes, + }) + return f'' def _is_css_path(self, path: str) -> bool: return bool( diff --git a/fastapi_startkit/uv.lock b/fastapi_startkit/uv.lock index 6dbf874d..4a56be09 100644 --- a/fastapi_startkit/uv.lock +++ b/fastapi_startkit/uv.lock @@ -443,7 +443,7 @@ wheels = [ [[package]] name = "fastapi-startkit" -version = "0.13.7" +version = "0.13.6" source = { editable = "." } dependencies = [ { name = "cleo" }, @@ -481,7 +481,6 @@ dev = [ { name = "dumpdie" }, { name = "pytest" }, { name = "pytest-asyncio" }, - { name = "ruff" }, { name = "twine" }, ] @@ -509,7 +508,6 @@ dev = [ { name = "dumpdie", specifier = ">=1.5.0" }, { name = "pytest", specifier = ">=9.0.3" }, { name = "pytest-asyncio", specifier = ">=1.3.0" }, - { name = "ruff", specifier = ">=0.15.12" }, { name = "twine", specifier = ">=6.2.0" }, ] @@ -1440,31 +1438,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/62/b88e5879512c55b8ee979c666ee6902adc4ed05007226de266410ae27965/rignore-0.7.6-cp314-cp314t-win_arm64.whl", hash = "sha256:b83adabeb3e8cf662cabe1931b83e165b88c526fa6af6b3aa90429686e474896", size = 656035, upload-time = "2025-11-05T21:41:31.13Z" }, ] -[[package]] -name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, -] - [[package]] name = "secretstorage" version = "3.5.0"