Skip to content

Commit

Permalink
Upgrade to Pydantic V2 - Initial Changes
Browse files Browse the repository at this point in the history
  • Loading branch information
yuvanist committed Aug 2, 2023
1 parent 743d6c1 commit e59bb96
Show file tree
Hide file tree
Showing 12 changed files with 34 additions and 34 deletions.
4 changes: 2 additions & 2 deletions gotrue/_async/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import Any, Dict, List, Optional, Union

from pydantic import parse_obj_as
from pydantic import TypeAdapter

from ..exceptions import APIError
from ..helpers import check_response, encode_uri_component
Expand Down Expand Up @@ -94,7 +94,7 @@ async def list_users(self) -> List[User]:
raise APIError("No users found in response", 400)
if not isinstance(users, list):
raise APIError("Expected a list of users", 400)
return parse_obj_as(List[User], users)
return TypeAdapter(List[User]).validate_python(users)

async def sign_up_with_email(
self,
Expand Down
4 changes: 2 additions & 2 deletions gotrue/_async/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,7 @@ async def _recover_common(self) -> Optional[Tuple[Session, int, int]]:
and session_raw
and isinstance(session_raw, dict)
):
session = Session.parse_obj(session_raw)
session = Session.model_validate(session_raw)
expires_at = int(expires_at_raw)
time_now = round(time())
return session, expires_at, time_now
Expand Down Expand Up @@ -628,7 +628,7 @@ async def _save_session(self, *, session: Session) -> None:
await self._persist_session(session=session)

async def _persist_session(self, *, session: Session) -> None:
data = {"session": session.dict(), "expires_at": session.expires_at}
data = {"session": session.model_dump(), "expires_at": session.expires_at}
await self.local_storage.set_item(STORAGE_KEY, dumps(data, default=str))

async def _remove_session(self) -> None:
Expand Down
6 changes: 3 additions & 3 deletions gotrue/_async/gotrue_admin_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ async def list_users(self) -> List[User]:
return await self._request(
"GET",
"admin/users",
xform=lambda data: [User.parse_obj(user) for user in data["users"]]
xform=lambda data: [User.model_validate(user) for user in data["users"]]
if "users" in data
else [],
)
Expand Down Expand Up @@ -161,7 +161,7 @@ async def _list_factors(
return await self._request(
"GET",
f"admin/users/{params.get('user_id')}/factors",
xform=AuthMFAAdminListFactorsResponse.parse_obj,
xform=AuthMFAAdminListFactorsResponse.model_validate,
)

async def _delete_factor(
Expand All @@ -171,5 +171,5 @@ async def _delete_factor(
return await self._request(
"DELETE",
f"admin/users/{params.get('user_id')}/factors/{params.get('factor_id')}",
xform=AuthMFAAdminDeleteFactorResponse.parse_obj,
xform=AuthMFAAdminDeleteFactorResponse.model_validate,
)
2 changes: 1 addition & 1 deletion gotrue/_async/gotrue_base_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ async def _request(
url,
headers=headers,
params=query,
json=body.dict() if isinstance(body, BaseModel) else body,
json=body.model_dump() if isinstance(body, BaseModel) else body,
)
response.raise_for_status()
result = response if no_resolve_json else response.json()
Expand Down
14 changes: 7 additions & 7 deletions gotrue/_async/gotrue_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,7 @@ async def _enroll(self, params: MFAEnrollParams) -> AuthMFAEnrollResponse:
"factors",
body=params,
jwt=session.access_token,
xform=AuthMFAEnrollResponse.parse_obj,
xform=AuthMFAEnrollResponse.model_validate,
)
if response.totp.qr_code:
response.totp.qr_code = f"data:image/svg+xml;utf-8,{response.totp.qr_code}"
Expand All @@ -545,7 +545,7 @@ async def _challenge(self, params: MFAChallengeParams) -> AuthMFAChallengeRespon
"POST",
f"factors/{params.get('factor_id')}/challenge",
jwt=session.access_token,
xform=AuthMFAChallengeResponse.parse_obj,
xform=AuthMFAChallengeResponse.model_validate,
)

async def _challenge_and_verify(
Expand Down Expand Up @@ -574,9 +574,9 @@ async def _verify(self, params: MFAVerifyParams) -> AuthMFAVerifyResponse:
f"factors/{params.get('factor_id')}/verify",
body=params,
jwt=session.access_token,
xform=AuthMFAVerifyResponse.parse_obj,
xform=AuthMFAVerifyResponse.model_validate,
)
session = Session.parse_obj(response.dict())
session = Session.model_validate(response.model_dump())
await self._save_session(session)
self._notify_all_subscribers("MFA_CHALLENGE_VERIFIED", session)
return response
Expand All @@ -589,7 +589,7 @@ async def _unenroll(self, params: MFAUnenrollParams) -> AuthMFAUnenrollResponse:
"DELETE",
f"factors/{params.get('factor_id')}",
jwt=session.access_token,
xform=AuthMFAUnenrollResponse.parse_obj,
xform=AuthMFAUnenrollResponse.model_validate,
)

async def _list_factors(self) -> AuthMFAListFactorsResponse:
Expand Down Expand Up @@ -751,7 +751,7 @@ async def _save_session(self, session: Session) -> None:
value = (expire_in - refresh_duration_before_expires) * 1000
await self._start_auto_refresh_token(value)
if self._persist_session and session.expires_at:
await self._storage.set_item(self._storage_key, session.json())
await self._storage.set_item(self._storage_key, session.model_dump_json())

async def _start_auto_refresh_token(self, value: float) -> None:
if self._refresh_token_timer:
Expand Down Expand Up @@ -808,7 +808,7 @@ def _get_valid_session(
except ValueError:
return None
try:
return Session.parse_obj(data)
return Session.model_validate(data)
except Exception:
return None

Expand Down
4 changes: 2 additions & 2 deletions gotrue/_sync/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import Any, Dict, List, Optional, Union

from pydantic import parse_obj_as
from pydantic import TypeAdapter

from ..exceptions import APIError
from ..helpers import check_response, encode_uri_component
Expand Down Expand Up @@ -94,7 +94,7 @@ def list_users(self) -> List[User]:
raise APIError("No users found in response", 400)
if not isinstance(users, list):
raise APIError("Expected a list of users", 400)
return parse_obj_as(List[User], users)
return TypeAdapter(List[User]).validate_python(users)

def sign_up_with_email(
self,
Expand Down
4 changes: 2 additions & 2 deletions gotrue/_sync/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,7 @@ def _recover_common(self) -> Optional[Tuple[Session, int, int]]:
and session_raw
and isinstance(session_raw, dict)
):
session = Session.parse_obj(session_raw)
session = Session.model_validate(session_raw)
expires_at = int(expires_at_raw)
time_now = round(time())
return session, expires_at, time_now
Expand Down Expand Up @@ -620,7 +620,7 @@ def _save_session(self, *, session: Session) -> None:
self._persist_session(session=session)

def _persist_session(self, *, session: Session) -> None:
data = {"session": session.dict(), "expires_at": session.expires_at}
data = {"session": session.model_dump(), "expires_at": session.expires_at}
self.local_storage.set_item(STORAGE_KEY, dumps(data, default=str))

def _remove_session(self) -> None:
Expand Down
6 changes: 3 additions & 3 deletions gotrue/_sync/gotrue_admin_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def list_users(self) -> List[User]:
return self._request(
"GET",
"admin/users",
xform=lambda data: [User.parse_obj(user) for user in data["users"]]
xform=lambda data: [User.model_validate(user) for user in data["users"]]
if "users" in data
else [],
)
Expand Down Expand Up @@ -161,7 +161,7 @@ def _list_factors(
return self._request(
"GET",
f"admin/users/{params.get('user_id')}/factors",
xform=AuthMFAAdminListFactorsResponse.parse_obj,
xform=AuthMFAAdminListFactorsResponse.model_validate,
)

def _delete_factor(
Expand All @@ -171,5 +171,5 @@ def _delete_factor(
return self._request(
"DELETE",
f"admin/users/{params.get('user_id')}/factors/{params.get('factor_id')}",
xform=AuthMFAAdminDeleteFactorResponse.parse_obj,
xform=AuthMFAAdminDeleteFactorResponse.model_validate,
)
2 changes: 1 addition & 1 deletion gotrue/_sync/gotrue_base_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ def _request(
url,
headers=headers,
params=query,
json=body.dict() if isinstance(body, BaseModel) else body,
json=body.model_dump() if isinstance(body, BaseModel) else body,
)
response.raise_for_status()
result = response if no_resolve_json else response.json()
Expand Down
12 changes: 6 additions & 6 deletions gotrue/_sync/gotrue_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ def _enroll(self, params: MFAEnrollParams) -> AuthMFAEnrollResponse:
"factors",
body=params,
jwt=session.access_token,
xform=AuthMFAEnrollResponse.parse_obj,
xform=AuthMFAEnrollResponse.model_validate,
)
if response.totp.qr_code:
response.totp.qr_code = f"data:image/svg+xml;utf-8,{response.totp.qr_code}"
Expand All @@ -543,7 +543,7 @@ def _challenge(self, params: MFAChallengeParams) -> AuthMFAChallengeResponse:
"POST",
f"factors/{params.get('factor_id')}/challenge",
jwt=session.access_token,
xform=AuthMFAChallengeResponse.parse_obj,
xform=AuthMFAChallengeResponse.model_validate,
)

def _challenge_and_verify(
Expand Down Expand Up @@ -572,9 +572,9 @@ def _verify(self, params: MFAVerifyParams) -> AuthMFAVerifyResponse:
f"factors/{params.get('factor_id')}/verify",
body=params,
jwt=session.access_token,
xform=AuthMFAVerifyResponse.parse_obj,
xform=AuthMFAVerifyResponse.model_validate,
)
session = Session.parse_obj(response.dict())
session = Session.model_validate(response.model_dump())
self._save_session(session)
self._notify_all_subscribers("MFA_CHALLENGE_VERIFIED", session)
return response
Expand All @@ -587,7 +587,7 @@ def _unenroll(self, params: MFAUnenrollParams) -> AuthMFAUnenrollResponse:
"DELETE",
f"factors/{params.get('factor_id')}",
jwt=session.access_token,
xform=AuthMFAUnenrollResponse.parse_obj,
xform=AuthMFAUnenrollResponse.model_validate,
)

def _list_factors(self) -> AuthMFAListFactorsResponse:
Expand Down Expand Up @@ -806,7 +806,7 @@ def _get_valid_session(
except ValueError:
return None
try:
return Session.parse_obj(data)
return Session.model_validate(data)
except Exception:
return None

Expand Down
8 changes: 4 additions & 4 deletions gotrue/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ def parse_auth_response(data: Any) -> AuthResponse:
and data["refresh_token"]
and data["expires_in"]
):
session = Session.parse_obj(data)
session = Session.model_validate(data)
user_data = data.get("user", data)
user = User.parse_obj(user_data) if user_data else None
user = User.model_validate(user_data) if user_data else None
return AuthResponse(session=session, user=user)


Expand All @@ -41,14 +41,14 @@ def parse_link_response(data: Any) -> GenerateLinkResponse:
redirect_to=data.get("redirect_to"),
verification_type=data.get("verification_type"),
)
user = User.parse_obj({k: v for k, v in data.items() if k not in properties.dict()})
user = User.model_validate({k: v for k, v in data.items() if k not in properties.model_dump()})
return GenerateLinkResponse(properties=properties, user=user)


def parse_user_response(data: Any) -> UserResponse:
if "user" not in data:
data = {"user": data}
return UserResponse.parse_obj(data)
return UserResponse.model_validate(data)


def get_error_message(error: Any) -> str:
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ classifiers = [
[tool.poetry.dependencies]
python = "^3.8"
httpx = ">=0.23,<0.25"
pydantic = "^1.10.0"
pydantic = "^2.0.0"

[tool.poetry.dev-dependencies]
pytest = "^7.3.1"
Expand Down

0 comments on commit e59bb96

Please sign in to comment.