Skip to content

Commit 91a3596

Browse files
authored
Merge pull request #32 from MrTrick/main
Updated pydantic to v2, updated fastapi to v0.103, other small fixes
2 parents 407f88c + 48b5941 commit 91a3596

File tree

7 files changed

+774
-718
lines changed

7 files changed

+774
-718
lines changed

{{cookiecutter.project_name}}/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ coverage.xml
5757
*.py,cover
5858
.hypothesis/
5959
.pytest_cache/
60+
log.txt
6061

6162
# Translations
6263
*.mo

{{cookiecutter.project_name}}/app/core/config.py

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
"""
2323

2424
import tomllib
25+
from functools import cached_property
2526
from pathlib import Path
2627
from typing import Literal
2728

28-
from pydantic import AnyHttpUrl, BaseSettings, EmailStr, PostgresDsn, validator
29+
from pydantic import AnyHttpUrl, EmailStr, PostgresDsn, computed_field
30+
from pydantic_settings import BaseSettings, SettingsConfigDict
2931

3032
PROJECT_DIR = Path(__file__).parent.parent.parent
3133
with open(f"{PROJECT_DIR}/pyproject.toml", "rb") as f:
@@ -51,47 +53,51 @@ class Settings(BaseSettings):
5153
DEFAULT_DATABASE_HOSTNAME: str
5254
DEFAULT_DATABASE_USER: str
5355
DEFAULT_DATABASE_PASSWORD: str
54-
DEFAULT_DATABASE_PORT: str
56+
DEFAULT_DATABASE_PORT: int
5557
DEFAULT_DATABASE_DB: str
56-
DEFAULT_SQLALCHEMY_DATABASE_URI: str = ""
5758

5859
# POSTGRESQL TEST DATABASE
5960
TEST_DATABASE_HOSTNAME: str = "postgres"
6061
TEST_DATABASE_USER: str = "postgres"
6162
TEST_DATABASE_PASSWORD: str = "postgres"
62-
TEST_DATABASE_PORT: str = "5432"
63+
TEST_DATABASE_PORT: int = 5432
6364
TEST_DATABASE_DB: str = "postgres"
64-
TEST_SQLALCHEMY_DATABASE_URI: str = ""
6565

6666
# FIRST SUPERUSER
6767
FIRST_SUPERUSER_EMAIL: EmailStr
6868
FIRST_SUPERUSER_PASSWORD: str
6969

70-
@validator("DEFAULT_SQLALCHEMY_DATABASE_URI")
71-
def _assemble_default_db_connection(cls, v: str, values: dict[str, str]) -> str:
72-
return PostgresDsn.build(
73-
scheme="postgresql+asyncpg",
74-
user=values["DEFAULT_DATABASE_USER"],
75-
password=values["DEFAULT_DATABASE_PASSWORD"],
76-
host=values["DEFAULT_DATABASE_HOSTNAME"],
77-
port=values["DEFAULT_DATABASE_PORT"],
78-
path=f"/{values['DEFAULT_DATABASE_DB']}",
70+
@computed_field
71+
@cached_property
72+
def DEFAULT_SQLALCHEMY_DATABASE_URI(self) -> str:
73+
return str(
74+
PostgresDsn.build(
75+
scheme="postgresql+asyncpg",
76+
username=self.DEFAULT_DATABASE_USER,
77+
password=self.DEFAULT_DATABASE_PASSWORD,
78+
host=self.DEFAULT_DATABASE_HOSTNAME,
79+
port=self.DEFAULT_DATABASE_PORT,
80+
path=self.DEFAULT_DATABASE_DB,
81+
)
7982
)
8083

81-
@validator("TEST_SQLALCHEMY_DATABASE_URI")
82-
def _assemble_test_db_connection(cls, v: str, values: dict[str, str]) -> str:
83-
return PostgresDsn.build(
84-
scheme="postgresql+asyncpg",
85-
user=values["TEST_DATABASE_USER"],
86-
password=values["TEST_DATABASE_PASSWORD"],
87-
host=values["TEST_DATABASE_HOSTNAME"],
88-
port=values["TEST_DATABASE_PORT"],
89-
path=f"/{values['TEST_DATABASE_DB']}",
84+
@computed_field
85+
@cached_property
86+
def TEST_SQLALCHEMY_DATABASE_URI(self) -> str:
87+
return str(
88+
PostgresDsn.build(
89+
scheme="postgresql+asyncpg",
90+
username=self.TEST_DATABASE_USER,
91+
password=self.TEST_DATABASE_PASSWORD,
92+
host=self.TEST_DATABASE_HOSTNAME,
93+
port=self.TEST_DATABASE_PORT,
94+
path=self.TEST_DATABASE_DB,
95+
)
9096
)
9197

92-
class Config:
93-
env_file = f"{PROJECT_DIR}/.env"
94-
case_sensitive = True
98+
model_config = SettingsConfigDict(
99+
env_file=f"{PROJECT_DIR}/.env", case_sensitive=True
100+
)
95101

96102

97103
settings: Settings = Settings() # type: ignore

{{cookiecutter.project_name}}/app/schemas/responses.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
from pydantic import BaseModel, EmailStr
1+
from pydantic import BaseModel, ConfigDict, EmailStr
22

33

44
class BaseResponse(BaseModel):
5-
# may define additional fields or config shared across responses
6-
class Config:
7-
orm_mode = True
5+
model_config = ConfigDict(from_attributes=True)
86

97

108
class AccessTokenResponse(BaseResponse):

0 commit comments

Comments
 (0)