Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit 86ac440

Browse files
authored
Merge pull request #286 from yuvanist/main
Upgrade gotrue-py to pydantic > 2.1.x
2 parents 743d6c1 + 6ca5a7d commit 86ac440

File tree

14 files changed

+684
-578
lines changed

14 files changed

+684
-578
lines changed

gotrue/_async/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

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

5-
from pydantic import parse_obj_as
5+
from pydantic import TypeAdapter
66

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

9999
async def sign_up_with_email(
100100
self,

gotrue/_async/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ async def _recover_common(self) -> Optional[Tuple[Session, int, int]]:
560560
and session_raw
561561
and isinstance(session_raw, dict)
562562
):
563-
session = Session.parse_obj(session_raw)
563+
session = Session.model_validate(session_raw)
564564
expires_at = int(expires_at_raw)
565565
time_now = round(time())
566566
return session, expires_at, time_now
@@ -628,7 +628,7 @@ async def _save_session(self, *, session: Session) -> None:
628628
await self._persist_session(session=session)
629629

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

634634
async def _remove_session(self) -> None:

gotrue/_async/gotrue_admin_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ async def list_users(self) -> List[User]:
109109
return await self._request(
110110
"GET",
111111
"admin/users",
112-
xform=lambda data: [User.parse_obj(user) for user in data["users"]]
112+
xform=lambda data: [User.model_validate(user) for user in data["users"]]
113113
if "users" in data
114114
else [],
115115
)
@@ -161,7 +161,7 @@ async def _list_factors(
161161
return await self._request(
162162
"GET",
163163
f"admin/users/{params.get('user_id')}/factors",
164-
xform=AuthMFAAdminListFactorsResponse.parse_obj,
164+
xform=AuthMFAAdminListFactorsResponse.model_validate,
165165
)
166166

167167
async def _delete_factor(
@@ -171,5 +171,5 @@ async def _delete_factor(
171171
return await self._request(
172172
"DELETE",
173173
f"admin/users/{params.get('user_id')}/factors/{params.get('factor_id')}",
174-
xform=AuthMFAAdminDeleteFactorResponse.parse_obj,
174+
xform=AuthMFAAdminDeleteFactorResponse.model_validate,
175175
)

gotrue/_async/gotrue_base_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ async def _request(
108108
url,
109109
headers=headers,
110110
params=query,
111-
json=body.dict() if isinstance(body, BaseModel) else body,
111+
json=body.model_dump() if isinstance(body, BaseModel) else body,
112112
)
113113
response.raise_for_status()
114114
result = response if no_resolve_json else response.json()

gotrue/_async/gotrue_client.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ async def _enroll(self, params: MFAEnrollParams) -> AuthMFAEnrollResponse:
531531
"factors",
532532
body=params,
533533
jwt=session.access_token,
534-
xform=AuthMFAEnrollResponse.parse_obj,
534+
xform=AuthMFAEnrollResponse.model_validate,
535535
)
536536
if response.totp.qr_code:
537537
response.totp.qr_code = f"data:image/svg+xml;utf-8,{response.totp.qr_code}"
@@ -545,7 +545,7 @@ async def _challenge(self, params: MFAChallengeParams) -> AuthMFAChallengeRespon
545545
"POST",
546546
f"factors/{params.get('factor_id')}/challenge",
547547
jwt=session.access_token,
548-
xform=AuthMFAChallengeResponse.parse_obj,
548+
xform=AuthMFAChallengeResponse.model_validate,
549549
)
550550

551551
async def _challenge_and_verify(
@@ -574,9 +574,9 @@ async def _verify(self, params: MFAVerifyParams) -> AuthMFAVerifyResponse:
574574
f"factors/{params.get('factor_id')}/verify",
575575
body=params,
576576
jwt=session.access_token,
577-
xform=AuthMFAVerifyResponse.parse_obj,
577+
xform=AuthMFAVerifyResponse.model_validate,
578578
)
579-
session = Session.parse_obj(response.dict())
579+
session = Session.model_validate(response.model_dump())
580580
await self._save_session(session)
581581
self._notify_all_subscribers("MFA_CHALLENGE_VERIFIED", session)
582582
return response
@@ -589,7 +589,7 @@ async def _unenroll(self, params: MFAUnenrollParams) -> AuthMFAUnenrollResponse:
589589
"DELETE",
590590
f"factors/{params.get('factor_id')}",
591591
jwt=session.access_token,
592-
xform=AuthMFAUnenrollResponse.parse_obj,
592+
xform=AuthMFAUnenrollResponse.model_validate,
593593
)
594594

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

756756
async def _start_auto_refresh_token(self, value: float) -> None:
757757
if self._refresh_token_timer:
@@ -808,7 +808,7 @@ def _get_valid_session(
808808
except ValueError:
809809
return None
810810
try:
811-
return Session.parse_obj(data)
811+
return Session.model_validate(data)
812812
except Exception:
813813
return None
814814

gotrue/_sync/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

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

5-
from pydantic import parse_obj_as
5+
from pydantic import TypeAdapter
66

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

9999
def sign_up_with_email(
100100
self,

gotrue/_sync/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ def _recover_common(self) -> Optional[Tuple[Session, int, int]]:
556556
and session_raw
557557
and isinstance(session_raw, dict)
558558
):
559-
session = Session.parse_obj(session_raw)
559+
session = Session.model_validate(session_raw)
560560
expires_at = int(expires_at_raw)
561561
time_now = round(time())
562562
return session, expires_at, time_now
@@ -620,7 +620,7 @@ def _save_session(self, *, session: Session) -> None:
620620
self._persist_session(session=session)
621621

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

626626
def _remove_session(self) -> None:

gotrue/_sync/gotrue_admin_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def list_users(self) -> List[User]:
109109
return self._request(
110110
"GET",
111111
"admin/users",
112-
xform=lambda data: [User.parse_obj(user) for user in data["users"]]
112+
xform=lambda data: [User.model_validate(user) for user in data["users"]]
113113
if "users" in data
114114
else [],
115115
)
@@ -161,7 +161,7 @@ def _list_factors(
161161
return self._request(
162162
"GET",
163163
f"admin/users/{params.get('user_id')}/factors",
164-
xform=AuthMFAAdminListFactorsResponse.parse_obj,
164+
xform=AuthMFAAdminListFactorsResponse.model_validate,
165165
)
166166

167167
def _delete_factor(
@@ -171,5 +171,5 @@ def _delete_factor(
171171
return self._request(
172172
"DELETE",
173173
f"admin/users/{params.get('user_id')}/factors/{params.get('factor_id')}",
174-
xform=AuthMFAAdminDeleteFactorResponse.parse_obj,
174+
xform=AuthMFAAdminDeleteFactorResponse.model_validate,
175175
)

gotrue/_sync/gotrue_base_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def _request(
108108
url,
109109
headers=headers,
110110
params=query,
111-
json=body.dict() if isinstance(body, BaseModel) else body,
111+
json=body.model_dump() if isinstance(body, BaseModel) else body,
112112
)
113113
response.raise_for_status()
114114
result = response if no_resolve_json else response.json()

gotrue/_sync/gotrue_client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ def _enroll(self, params: MFAEnrollParams) -> AuthMFAEnrollResponse:
529529
"factors",
530530
body=params,
531531
jwt=session.access_token,
532-
xform=AuthMFAEnrollResponse.parse_obj,
532+
xform=AuthMFAEnrollResponse.model_validate,
533533
)
534534
if response.totp.qr_code:
535535
response.totp.qr_code = f"data:image/svg+xml;utf-8,{response.totp.qr_code}"
@@ -543,7 +543,7 @@ def _challenge(self, params: MFAChallengeParams) -> AuthMFAChallengeResponse:
543543
"POST",
544544
f"factors/{params.get('factor_id')}/challenge",
545545
jwt=session.access_token,
546-
xform=AuthMFAChallengeResponse.parse_obj,
546+
xform=AuthMFAChallengeResponse.model_validate,
547547
)
548548

549549
def _challenge_and_verify(
@@ -572,9 +572,9 @@ def _verify(self, params: MFAVerifyParams) -> AuthMFAVerifyResponse:
572572
f"factors/{params.get('factor_id')}/verify",
573573
body=params,
574574
jwt=session.access_token,
575-
xform=AuthMFAVerifyResponse.parse_obj,
575+
xform=AuthMFAVerifyResponse.model_validate,
576576
)
577-
session = Session.parse_obj(response.dict())
577+
session = Session.model_validate(response.model_dump())
578578
self._save_session(session)
579579
self._notify_all_subscribers("MFA_CHALLENGE_VERIFIED", session)
580580
return response
@@ -587,7 +587,7 @@ def _unenroll(self, params: MFAUnenrollParams) -> AuthMFAUnenrollResponse:
587587
"DELETE",
588588
f"factors/{params.get('factor_id')}",
589589
jwt=session.access_token,
590-
xform=AuthMFAUnenrollResponse.parse_obj,
590+
xform=AuthMFAUnenrollResponse.model_validate,
591591
)
592592

593593
def _list_factors(self) -> AuthMFAListFactorsResponse:
@@ -806,7 +806,7 @@ def _get_valid_session(
806806
except ValueError:
807807
return None
808808
try:
809-
return Session.parse_obj(data)
809+
return Session.model_validate(data)
810810
except Exception:
811811
return None
812812

0 commit comments

Comments
 (0)