Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Migrate from Pydantic V1 to V2 [WIP] #76

Merged
merged 27 commits into from
Jun 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
e6e5729
✨ Support pydantic v2
DavidRomanovizc Jan 30, 2024
05f2e1a
🐛 added the staticmethod to names
DavidRomanovizc Jan 31, 2024
c1e304b
✨ Support pydantic v2
DavidRomanovizc Jan 31, 2024
652585a
Add dev-3.x branch
mahenzon Feb 19, 2024
5fe1bea
🚨 minor fixes
DavidRomanovizc Mar 11, 2024
099d83f
Merge remote-tracking branch 'origin/main'
DavidRomanovizc Mar 11, 2024
44950e0
fix decorators order
DavidRomanovizc Apr 24, 2024
cac438b
change declarative_base to DeclarativeBase
DavidRomanovizc Apr 24, 2024
072e770
♻️ use `__init_subclass__` instead of metaclass to register models
DavidRomanovizc Apr 24, 2024
20535c2
minor fixes
DavidRomanovizc Apr 24, 2024
f714045
move ._internal import under TYPE_CHECKING
DavidRomanovizc Apr 24, 2024
040afce
change host
DavidRomanovizc Apr 24, 2024
f087ef5
Merge branch 'dev-3.x' into main
DavidRomanovizc May 1, 2024
f5ec545
minor fixes
DavidRomanovizc May 1, 2024
37de047
⬆️ upgrade dependencies
DavidRomanovizc May 1, 2024
4ef3f2e
minor fixes
DavidRomanovizc May 2, 2024
c42c573
minor fixes for test_request_data pass
DavidRomanovizc May 2, 2024
72944e8
possible solve for ImportError AsyncpgUUID
DavidRomanovizc May 2, 2024
a3d3a5e
♻️ change deprecated extra keyword arguments to json_schema_extra
DavidRomanovizc May 11, 2024
526a2b9
minor fixes
DavidRomanovizc May 11, 2024
cc44a1f
change deprecated update_forward_refs to model_rebuild
DavidRomanovizc May 11, 2024
78b8424
🚧 fix `Param: field can only be a request body, using Body()`
DavidRomanovizc May 11, 2024
2a72365
♻️ minor fixes
DavidRomanovizc May 21, 2024
c1c97b2
⚗️ documented keys_to_ids_list
DavidRomanovizc May 21, 2024
b55b90e
🩹 fix AttributeError
DavidRomanovizc May 21, 2024
2543a06
✨ add func for update type to real obj
DavidRomanovizc May 21, 2024
68a19b9
🚨 change '' to ""
DavidRomanovizc May 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions docs/python_snippets/client_generated_id/schematic_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

import uvicorn
from fastapi import APIRouter, Depends, FastAPI
from pydantic import ConfigDict
from fastapi_jsonapi.schema_base import Field, BaseModel as PydanticBaseModel
from sqlalchemy import Column, Integer, Text
from sqlalchemy.engine import make_url
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
from sqlalchemy.orm import DeclarativeBase

from fastapi_jsonapi import RoutersJSONAPI, init
from fastapi_jsonapi.misc.sqla.generics.base import DetailViewBaseGeneric, ListViewBaseGeneric
Expand All @@ -22,7 +22,9 @@
DB_URL = f"sqlite+aiosqlite:///{CURRENT_DIR.absolute()}/db.sqlite3"
sys.path.append(str(PROJECT_DIR))

Base = declarative_base()

class Base(DeclarativeBase):
pass


class User(Base):
Expand All @@ -32,8 +34,7 @@ class User(Base):


class BaseModel(PydanticBaseModel):
class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)


class UserAttributesBaseSchema(BaseModel):
Expand All @@ -51,11 +52,11 @@ class UserPatchSchema(UserAttributesBaseSchema):
class UserInSchema(UserAttributesBaseSchema):
"""User input schema."""

id: int = Field(client_can_set_id=True)
id: int = Field(json_schema_extra={"client_can_set_id": True})


async def get_session():
sess = sessionmaker(
sess = async_sessionmaker(
bind=create_async_engine(url=make_url(DB_URL)),
class_=AsyncSession,
expire_on_commit=False,
Expand All @@ -74,8 +75,7 @@ async def sqlalchemy_init() -> None:
class SessionDependency(BaseModel):
session: AsyncSession = Depends(get_session)

class Config:
arbitrary_types_allowed = True
model_config = ConfigDict(arbitrary_types_allowed=True)


def session_dependency_handler(view: ViewBase, dto: SessionDependency) -> dict:
Expand Down
41 changes: 24 additions & 17 deletions docs/python_snippets/relationships/relationships_info_example.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
from typing import Optional

from pydantic import BaseModel as PydanticBaseModel
from pydantic import BaseModel as PydanticBaseModel, ConfigDict

from fastapi_jsonapi.schema_base import Field, RelationshipInfo


class BaseModel(PydanticBaseModel):
class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)


class UserBaseSchema(BaseModel):
id: int
name: str
bio: Optional["UserBioSchema"] = Field(
relationship=RelationshipInfo(
resource_type="user_bio",
),
json_schema_extra={
"relationship": RelationshipInfo(
resource_type="user_bio",
),
},
)
computers: Optional["ComputerSchema"] = Field(
relationship=RelationshipInfo(
resource_type="computer",
many=True,
),
json_schema_extra={
"relationship": RelationshipInfo(
resource_type="computer",
many=True,
),
},
)


Expand All @@ -34,20 +37,24 @@ class UserSchema(BaseModel):
class UserBioBaseSchema(BaseModel):
birth_city: str
favourite_movies: str
keys_to_ids_list: dict[str, list[int]] = None
# keys_to_ids_list: Optional[dict[str, list[int]]] = None

user: "UserSchema" = Field(
relationship=RelationshipInfo(
resource_type="user",
),
json_schema_extra={
"relationship": RelationshipInfo(
resource_type="user",
),
},
)


class ComputerBaseSchema(BaseModel):
id: int
name: str
user: Optional["UserSchema"] = Field(
relationship=RelationshipInfo(
resource_type="user",
),
json_schema_extra={
"relationship": RelationshipInfo(
resource_type="user",
),
},
)
5 changes: 2 additions & 3 deletions docs/python_snippets/view_dependencies/main_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from typing import ClassVar, Dict

from fastapi import Depends, Header
from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict
from sqlalchemy.engine import make_url
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import create_async_engine
Expand Down Expand Up @@ -50,8 +50,7 @@ async def async_session_dependency():
class SessionDependency(BaseModel):
session: AsyncSession = Depends(async_session_dependency)

class Config:
arbitrary_types_allowed = True
model_config = ConfigDict(arbitrary_types_allowed=True)


async def common_handler(view: ViewBase, dto: SessionDependency) -> dict:
Expand Down
5 changes: 2 additions & 3 deletions examples/api_for_sqlalchemy/api/views_base.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import ClassVar, Dict

from fastapi import Depends
from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict
from sqlalchemy.ext.asyncio import AsyncSession

from examples.api_for_sqlalchemy.extensions.sqlalchemy import Connector
Expand All @@ -14,8 +14,7 @@
class SessionDependency(BaseModel):
session: AsyncSession = Depends(Connector.get_session)

class Config:
arbitrary_types_allowed = True
model_config = ConfigDict(arbitrary_types_allowed=True)


def handler(view: ViewBase, dto: SessionDependency) -> Dict:
Expand Down
7 changes: 4 additions & 3 deletions examples/api_for_sqlalchemy/extensions/sqlalchemy.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from sqlalchemy.engine import make_url
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import DeclarativeBase, sessionmaker

from examples.api_for_sqlalchemy import config

Base = declarative_base()

class Base(DeclarativeBase):
pass


def async_session() -> sessionmaker:
Expand Down
10 changes: 5 additions & 5 deletions examples/api_for_sqlalchemy/models/child.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.orm import Mapped, mapped_column, relationship

from examples.api_for_sqlalchemy.extensions.sqlalchemy import Base
from examples.api_for_sqlalchemy.models import ParentToChildAssociation
from examples.api_for_sqlalchemy.utils.sqlalchemy.base_model_mixin import BaseModelMixin


class Child(Base, BaseModelMixin):
__tablename__ = "right_table_children"

id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String, nullable=False)
parents = relationship(
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str] = mapped_column(nullable=False)
parents: Mapped["ParentToChildAssociation"] = relationship(
"ParentToChildAssociation",
back_populates="child",
)
16 changes: 9 additions & 7 deletions examples/api_for_sqlalchemy/models/schemas/child.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from typing import TYPE_CHECKING, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -9,17 +11,17 @@
class ChildBaseSchema(BaseModel):
"""Child base schema."""

class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)

name: str

parents: List["ParentToChildAssociationSchema"] = Field(
default=None,
relationship=RelationshipInfo(
resource_type="parent_child_association",
many=True,
),
json_schema_extra={
"relationship": RelationshipInfo(
resource_type="parent_child_association",
many=True,
),
},
)


Expand Down
20 changes: 9 additions & 11 deletions examples/api_for_sqlalchemy/models/schemas/computer.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

from typing import TYPE_CHECKING, Optional

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -11,16 +13,15 @@
class ComputerBaseSchema(BaseModel):
"""Computer base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

name: str
user: Optional["UserSchema"] = Field(
relationship=RelationshipInfo(
resource_type="user",
),
json_schema_extra={
"relationship": RelationshipInfo(
resource_type="user",
),
},
)


Expand All @@ -35,9 +36,6 @@ class ComputerInSchema(ComputerBaseSchema):
class ComputerSchema(ComputerInSchema):
"""Computer item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
5 changes: 3 additions & 2 deletions examples/api_for_sqlalchemy/models/schemas/parent.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from typing import TYPE_CHECKING, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -9,8 +11,7 @@
class ParentBaseSchema(BaseModel):
"""Parent base schema."""

class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)

name: str

Expand Down
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/post.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from datetime import datetime
from typing import TYPE_CHECKING, List

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -13,10 +15,7 @@
class PostBaseSchema(BaseModel):
"""Post base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

title: str
body: str
Expand Down Expand Up @@ -46,10 +45,7 @@ class PostInSchema(PostBaseSchema):
class PostSchema(PostInSchema):
"""Post item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
created_at: datetime = Field(description="Create datetime")
Expand Down
12 changes: 4 additions & 8 deletions examples/api_for_sqlalchemy/models/schemas/post_comment.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from datetime import datetime
from typing import TYPE_CHECKING

from pydantic import ConfigDict

from fastapi_jsonapi.schema_base import BaseModel, Field, RelationshipInfo

if TYPE_CHECKING:
Expand All @@ -12,10 +14,7 @@
class PostCommentBaseSchema(BaseModel):
"""PostComment base schema."""

class Config:
"""Pydantic schema config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

text: str
created_at: datetime = Field(description="Create datetime")
Expand Down Expand Up @@ -44,9 +43,6 @@ class PostCommentInSchema(PostCommentBaseSchema):
class PostCommentSchema(PostCommentInSchema):
"""PostComment item schema."""

class Config:
"""Pydantic model config."""

orm_mode = True
model_config = ConfigDict(from_attributes=True)

id: int
Loading
Loading