From d7d534532193eb64be59690dbf77a5872eb280d7 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:41:26 -0300 Subject: [PATCH 01/19] fix: Types to use Option[T] --- supabase_auth/_async/gotrue_admin_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supabase_auth/_async/gotrue_admin_api.py b/supabase_auth/_async/gotrue_admin_api.py index 24f64bd0..b2b17d11 100644 --- a/supabase_auth/_async/gotrue_admin_api.py +++ b/supabase_auth/_async/gotrue_admin_api.py @@ -1,7 +1,7 @@ from __future__ import annotations from functools import partial -from typing import Dict, List, Union +from typing import Dict, List, Optional from ..helpers import model_validate, parse_link_response, parse_user_response from ..http_clients import AsyncClient @@ -28,7 +28,7 @@ def __init__( *, url: str = "", headers: Dict[str, str] = {}, - http_client: Union[AsyncClient, None] = None, + http_client: Optional[AsyncClient] = None, verify: bool = True, ) -> None: AsyncGoTrueBaseAPI.__init__( From 3e1f388ab5c19fc1e1a22c10427b44cf268e4d90 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:41:32 -0300 Subject: [PATCH 02/19] fix: Types to use Option[T] --- supabase_auth/_async/gotrue_base_api.py | 48 ++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/supabase_auth/_async/gotrue_base_api.py b/supabase_auth/_async/gotrue_base_api.py index 9bab1581..4f027512 100644 --- a/supabase_auth/_async/gotrue_base_api.py +++ b/supabase_auth/_async/gotrue_base_api.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Callable, Dict, TypeVar, Union, overload +from typing import Any, Callable, Dict, TypeVar, overload, Optional from httpx import Response from pydantic import BaseModel @@ -19,7 +19,7 @@ def __init__( *, url: str, headers: Dict[str, str], - http_client: Union[AsyncClient, None], + http_client: Optional[AsyncClient], verify: bool = True, ): self._url = url @@ -45,11 +45,11 @@ async def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: Literal[False] = False, xform: Callable[[Any], T], ) -> T: ... # pragma: no cover @@ -60,11 +60,11 @@ async def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: Literal[True], xform: Callable[[Response], T], ) -> T: ... # pragma: no cover @@ -75,11 +75,11 @@ async def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: bool = False, ) -> None: ... # pragma: no cover @@ -88,14 +88,14 @@ async def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: bool = False, - xform: Union[Callable[[Any], T], None] = None, - ) -> Union[T, None]: + xform: Optional[Callable[[Any], T]] = None, + ) -> Optional[T]: url = f"{self._url}/{path}" headers = {**self._headers, **(headers or {})} if API_VERSION_HEADER_NAME not in headers: From fef8230ada079250b179905257b2244a145687f3 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:41:39 -0300 Subject: [PATCH 03/19] fix: Types to use Option[T] --- supabase_auth/_async/gotrue_client.py | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/supabase_auth/_async/gotrue_client.py b/supabase_auth/_async/gotrue_client.py index 90013a9e..fe23185b 100644 --- a/supabase_auth/_async/gotrue_client.py +++ b/supabase_auth/_async/gotrue_client.py @@ -4,7 +4,7 @@ from functools import partial from json import loads from time import time -from typing import Callable, Dict, List, Tuple, Union +from typing import Callable, Dict, List, Tuple, Optional from urllib.parse import parse_qs, urlencode, urlparse from uuid import uuid4 @@ -87,13 +87,13 @@ class AsyncGoTrueClient(AsyncGoTrueBaseAPI): def __init__( self, *, - url: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - storage_key: Union[str, None] = None, + url: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + storage_key: Optional[str] = None, auto_refresh_token: bool = True, persist_session: bool = True, - storage: Union[AsyncSupportedStorage, None] = None, - http_client: Union[AsyncClient, None] = None, + storage: Optional[AsyncSupportedStorage] = None, + http_client: Optional[AsyncClient] = None, flow_type: AuthFlowType = "implicit", verify: bool = True, ) -> None: @@ -108,8 +108,8 @@ def __init__( self._auto_refresh_token = auto_refresh_token self._persist_session = persist_session self._storage = storage or AsyncMemoryStorage() - self._in_memory_session: Union[Session, None] = None - self._refresh_token_timer: Union[Timer, None] = None + self._in_memory_session: Optional[Session] = None + self._refresh_token_timer: Optional[Timer] = None self._network_retries = 0 self._state_change_emitters: Dict[str, Subscription] = {} self._flow_type = flow_type @@ -132,7 +132,7 @@ def __init__( # Initializations - async def initialize(self, *, url: Union[str, None] = None) -> None: + async def initialize(self, *, url: Optional[str] = None) -> None: if url and self._is_implicit_grant_flow(url): await self.initialize_from_url(url) else: @@ -156,7 +156,7 @@ async def initialize_from_url(self, url: str) -> None: # Public methods async def sign_in_anonymously( - self, credentials: Union[SignInAnonymouslyCredentials, None] = None + self, credentials: Optional[SignInAnonymouslyCredentials] = None ) -> AuthResponse: """ Creates a new anonymous user. @@ -589,14 +589,14 @@ async def reauthenticate(self) -> AuthResponse: xform=parse_auth_response, ) - async def get_session(self) -> Union[Session, None]: + async def get_session(self) -> Optional[Session]: """ Returns the session, refreshing it if necessary. The session returned can be null if the session is not detected which can happen in the event a user is not signed-in or has logged out. """ - current_session: Union[Session, None] = None + current_session: Optional[Session] = None if self._persist_session: maybe_session = await self._storage.get_item(self._storage_key) current_session = self._get_valid_session(maybe_session) @@ -618,7 +618,7 @@ async def get_session(self) -> Union[Session, None]: else current_session ) - async def get_user(self, jwt: Union[str, None] = None) -> Union[UserResponse, None]: + async def get_user(self, jwt: Optional[str] = None) -> Optional[UserResponse]: """ Gets the current user details if there is an existing session. @@ -670,7 +670,7 @@ async def set_session(self, access_token: str, refresh_token: str) -> AuthRespon time_now = round(time()) expires_at = time_now has_expired = True - session: Union[Session, None] = None + session: Optional[Session] = None if access_token and access_token.split(".")[1]: payload = self._decode_jwt(access_token) exp = payload.get("exp") @@ -699,7 +699,7 @@ async def set_session(self, access_token: str, refresh_token: str) -> AuthRespon return AuthResponse(session=session, user=response.user) async def refresh_session( - self, refresh_token: Union[str, None] = None + self, refresh_token: Optional[str] = None ) -> AuthResponse: """ Returns a new session, regardless of expiry status. @@ -741,7 +741,7 @@ async def sign_out(self, options: SignOutOptions = {"scope": "global"}) -> None: def on_auth_state_change( self, - callback: Callable[[AuthChangeEvent, Union[Session, None]], None], + callback: Callable[[AuthChangeEvent, Optional[Session]], None], ) -> Subscription: """ Receive a notification every time an auth event happens. @@ -887,7 +887,7 @@ async def _get_authenticator_assurance_level( current_authentication_methods=[], ) payload = self._decode_jwt(session.access_token) - current_level: Union[AuthenticatorAssuranceLevels, None] = None + current_level: Optional[AuthenticatorAssuranceLevels] = None if payload.get("aal"): current_level = payload.get("aal") verified_factors = [ @@ -915,7 +915,7 @@ async def _remove_session(self) -> None: async def _get_session_from_url( self, url: str, - ) -> Tuple[Session, Union[str, None]]: + ) -> Tuple[Session, Optional[str]]: if not self._is_implicit_grant_flow(url): raise AuthImplicitGrantRedirectError("Not a valid implicit grant flow url.") result = urlparse(url) @@ -1060,15 +1060,15 @@ async def refresh_token_function(): def _notify_all_subscribers( self, event: AuthChangeEvent, - session: Union[Session, None], + session: Optional[Session], ) -> None: for subscription in self._state_change_emitters.values(): subscription.callback(event, session) def _get_valid_session( self, - raw_session: Union[str, None], - ) -> Union[Session, None]: + raw_session: Optional[str], + ) -> Optional[Session]: if not raw_session: return None data = loads(raw_session) @@ -1094,7 +1094,7 @@ def _get_param( self, query_params: Dict[str, List[str]], name: str, - ) -> Union[str, None]: + ) -> Optional[str]: return query_params[name][0] if name in query_params else None def _is_implicit_grant_flow(self, url: str) -> bool: From f37a29a565ca61fcf06252fd4f8fa3b6c3d69735 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:41:47 -0300 Subject: [PATCH 04/19] fix: Types to use Option[T] --- supabase_auth/_sync/gotrue_admin_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supabase_auth/_sync/gotrue_admin_api.py b/supabase_auth/_sync/gotrue_admin_api.py index c4ae6b99..c10b00a2 100644 --- a/supabase_auth/_sync/gotrue_admin_api.py +++ b/supabase_auth/_sync/gotrue_admin_api.py @@ -1,7 +1,7 @@ from __future__ import annotations from functools import partial -from typing import Dict, List, Union +from typing import Dict, List, Optional from ..helpers import model_validate, parse_link_response, parse_user_response from ..http_clients import SyncClient @@ -28,7 +28,7 @@ def __init__( *, url: str = "", headers: Dict[str, str] = {}, - http_client: Union[SyncClient, None] = None, + http_client: Optional[SyncClient] = None, verify: bool = True, ) -> None: SyncGoTrueBaseAPI.__init__( From a6f706dc217799a0ee2e1f5f15874dd6e35ef18c Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:00 -0300 Subject: [PATCH 05/19] fix: Types to use Option[T] --- supabase_auth/_sync/gotrue_base_api.py | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/supabase_auth/_sync/gotrue_base_api.py b/supabase_auth/_sync/gotrue_base_api.py index dd2cf257..c494271d 100644 --- a/supabase_auth/_sync/gotrue_base_api.py +++ b/supabase_auth/_sync/gotrue_base_api.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Callable, Dict, TypeVar, Union, overload +from typing import Any, Callable, Dict, TypeVar, overload, Optional from httpx import Response from pydantic import BaseModel @@ -19,7 +19,7 @@ def __init__( *, url: str, headers: Dict[str, str], - http_client: Union[SyncClient, None], + http_client: Optional[SyncClient], verify: bool = True, ): self._url = url @@ -45,11 +45,11 @@ def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: Literal[False] = False, xform: Callable[[Any], T], ) -> T: ... # pragma: no cover @@ -60,11 +60,11 @@ def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: Literal[True], xform: Callable[[Response], T], ) -> T: ... # pragma: no cover @@ -75,11 +75,11 @@ def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: bool = False, ) -> None: ... # pragma: no cover @@ -88,14 +88,14 @@ def _request( method: Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"], path: str, *, - jwt: Union[str, None] = None, - redirect_to: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - query: Union[Dict[str, str], None] = None, - body: Union[Any, None] = None, + jwt: Optional[str] = None, + redirect_to: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + query: Optional[Dict[str, str]] = None, + body: Optional[Any] = None, no_resolve_json: bool = False, - xform: Union[Callable[[Any], T], None] = None, - ) -> Union[T, None]: + xform: Optional[Callable[[Any], T]] = None, + ) -> Optional[T]: url = f"{self._url}/{path}" headers = {**self._headers, **(headers or {})} if API_VERSION_HEADER_NAME not in headers: From edc5a8a1413d1e59ba390b35157fdede22725675 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:07 -0300 Subject: [PATCH 06/19] fix: Types to use Option[T] --- supabase_auth/timer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/supabase_auth/timer.py b/supabase_auth/timer.py index 1b6bf9b8..7a1b4496 100644 --- a/supabase_auth/timer.py +++ b/supabase_auth/timer.py @@ -1,18 +1,18 @@ import asyncio from threading import Timer as _Timer -from typing import Any, Callable, Coroutine, Union, cast +from typing import Any, Callable, Coroutine, cast, Optional class Timer: def __init__( self, seconds: float, - function: Callable[[], Union[Coroutine[Any, Any, None], None]], + function: Callable[[], Optional[Coroutine[Any, Any, None]]], ) -> None: self._milliseconds = seconds self._function = function - self._task: Union[asyncio.Task, None] = None - self._timer: Union[_Timer, None] = None + self._task: Optional[asyncio.Task] = None + self._timer: Optional[_Timer] = None def start(self) -> None: if asyncio.iscoroutinefunction(self._function): From 2e11af14c5f9eb7866df0a373b3ab48c7b88cec7 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:22 -0300 Subject: [PATCH 07/19] fix: Types to use Option[T] --- supabase_auth/_sync/gotrue_client.py | 44 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/supabase_auth/_sync/gotrue_client.py b/supabase_auth/_sync/gotrue_client.py index 16ee3e65..49fecf61 100644 --- a/supabase_auth/_sync/gotrue_client.py +++ b/supabase_auth/_sync/gotrue_client.py @@ -4,7 +4,7 @@ from functools import partial from json import loads from time import time -from typing import Callable, Dict, List, Tuple, Union +from typing import Callable, Dict, List, Tuple, Optional from urllib.parse import parse_qs, urlencode, urlparse from uuid import uuid4 @@ -87,13 +87,13 @@ class SyncGoTrueClient(SyncGoTrueBaseAPI): def __init__( self, *, - url: Union[str, None] = None, - headers: Union[Dict[str, str], None] = None, - storage_key: Union[str, None] = None, + url: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, + storage_key: Optional[str] = None, auto_refresh_token: bool = True, persist_session: bool = True, - storage: Union[SyncSupportedStorage, None] = None, - http_client: Union[SyncClient, None] = None, + storage: Optional[SyncSupportedStorage] = None, + http_client: Optional[SyncClient] = None, flow_type: AuthFlowType = "implicit", verify: bool = True, ) -> None: @@ -108,8 +108,8 @@ def __init__( self._auto_refresh_token = auto_refresh_token self._persist_session = persist_session self._storage = storage or SyncMemoryStorage() - self._in_memory_session: Union[Session, None] = None - self._refresh_token_timer: Union[Timer, None] = None + self._in_memory_session: Optional[Session] = None + self._refresh_token_timer: Optional[Timer] = None self._network_retries = 0 self._state_change_emitters: Dict[str, Subscription] = {} self._flow_type = flow_type @@ -132,7 +132,7 @@ def __init__( # Initializations - def initialize(self, *, url: Union[str, None] = None) -> None: + def initialize(self, *, url: Optional[str] = None) -> None: if url and self._is_implicit_grant_flow(url): self.initialize_from_url(url) else: @@ -156,7 +156,7 @@ def initialize_from_url(self, url: str) -> None: # Public methods def sign_in_anonymously( - self, credentials: Union[SignInAnonymouslyCredentials, None] = None + self, credentials: Optional[SignInAnonymouslyCredentials] = None ) -> AuthResponse: """ Creates a new anonymous user. @@ -583,14 +583,14 @@ def reauthenticate(self) -> AuthResponse: xform=parse_auth_response, ) - def get_session(self) -> Union[Session, None]: + def get_session(self) -> Optional[Session]: """ Returns the session, refreshing it if necessary. The session returned can be null if the session is not detected which can happen in the event a user is not signed-in or has logged out. """ - current_session: Union[Session, None] = None + current_session: Optional[Session] = None if self._persist_session: maybe_session = self._storage.get_item(self._storage_key) current_session = self._get_valid_session(maybe_session) @@ -612,7 +612,7 @@ def get_session(self) -> Union[Session, None]: else current_session ) - def get_user(self, jwt: Union[str, None] = None) -> Union[UserResponse, None]: + def get_user(self, jwt: Optional[str] = None) -> Optional[UserResponse]: """ Gets the current user details if there is an existing session. @@ -664,7 +664,7 @@ def set_session(self, access_token: str, refresh_token: str) -> AuthResponse: time_now = round(time()) expires_at = time_now has_expired = True - session: Union[Session, None] = None + session: Optional[Session] = None if access_token and access_token.split(".")[1]: payload = self._decode_jwt(access_token) exp = payload.get("exp") @@ -692,7 +692,7 @@ def set_session(self, access_token: str, refresh_token: str) -> AuthResponse: self._notify_all_subscribers("TOKEN_REFRESHED", session) return AuthResponse(session=session, user=response.user) - def refresh_session(self, refresh_token: Union[str, None] = None) -> AuthResponse: + def refresh_session(self, refresh_token: Optional[str] = None) -> AuthResponse: """ Returns a new session, regardless of expiry status. @@ -733,7 +733,7 @@ def sign_out(self, options: SignOutOptions = {"scope": "global"}) -> None: def on_auth_state_change( self, - callback: Callable[[AuthChangeEvent, Union[Session, None]], None], + callback: Callable[[AuthChangeEvent, Optional[Session]], None], ) -> Subscription: """ Receive a notification every time an auth event happens. @@ -879,7 +879,7 @@ def _get_authenticator_assurance_level( current_authentication_methods=[], ) payload = self._decode_jwt(session.access_token) - current_level: Union[AuthenticatorAssuranceLevels, None] = None + current_level: Optional[AuthenticatorAssuranceLevels] = None if payload.get("aal"): current_level = payload.get("aal") verified_factors = [ @@ -907,7 +907,7 @@ def _remove_session(self) -> None: def _get_session_from_url( self, url: str, - ) -> Tuple[Session, Union[str, None]]: + ) -> Tuple[Session, Optional[str]]: if not self._is_implicit_grant_flow(url): raise AuthImplicitGrantRedirectError("Not a valid implicit grant flow url.") result = urlparse(url) @@ -1052,15 +1052,15 @@ def refresh_token_function(): def _notify_all_subscribers( self, event: AuthChangeEvent, - session: Union[Session, None], + session: Optional[Session], ) -> None: for subscription in self._state_change_emitters.values(): subscription.callback(event, session) def _get_valid_session( self, - raw_session: Union[str, None], - ) -> Union[Session, None]: + raw_session: Optional[str], + ) -> Optional[Session]: if not raw_session: return None data = loads(raw_session) @@ -1086,7 +1086,7 @@ def _get_param( self, query_params: Dict[str, List[str]], name: str, - ) -> Union[str, None]: + ) -> Optional[str]: return query_params[name][0] if name in query_params else None def _is_implicit_grant_flow(self, url: str) -> bool: From b80104890ace4de8195804a921a5e02c54dde3f0 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:29 -0300 Subject: [PATCH 08/19] fix: Types to use Option[T] --- supabase_auth/errors.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/supabase_auth/errors.py b/supabase_auth/errors.py index df423800..2fc1c138 100644 --- a/supabase_auth/errors.py +++ b/supabase_auth/errors.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import List, Literal, Union +from typing import List, Literal, Optional from typing_extensions import TypedDict @@ -153,14 +153,14 @@ class AuthImplicitGrantRedirectErrorDetails(TypedDict): class AuthImplicitGrantRedirectErrorDict(AuthApiErrorDict): - details: Union[AuthImplicitGrantRedirectErrorDetails, None] + details: Optional[AuthImplicitGrantRedirectErrorDetails] class AuthImplicitGrantRedirectError(CustomAuthError): def __init__( self, message: str, - details: Union[AuthImplicitGrantRedirectErrorDetails, None] = None, + details: Optional[AuthImplicitGrantRedirectErrorDetails] = None, ) -> None: CustomAuthError.__init__( self, From f0a8a4e03cb034909ed606cec704cec87b33bc2d Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:34 -0300 Subject: [PATCH 09/19] fix: Types to use Option[T] --- supabase_auth/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/supabase_auth/helpers.py b/supabase_auth/helpers.py index 25e9aa78..5eea7d47 100644 --- a/supabase_auth/helpers.py +++ b/supabase_auth/helpers.py @@ -8,7 +8,7 @@ from base64 import urlsafe_b64decode from datetime import datetime from json import loads -from typing import Any, Dict, Type, TypeVar, Union, cast +from typing import Any, Dict, Type, TypeVar, cast, Optional from httpx import HTTPStatusError, Response from pydantic import BaseModel @@ -68,7 +68,7 @@ def model_dump_json(model: BaseModel) -> str: def parse_auth_response(data: Any) -> AuthResponse: - session: Union[Session, None] = None + session: Optional[Session] = None if ( "access_token" in data and "refresh_token" in data From 05622eb08b0baa44d652fc5c358d26d6c40a803a Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:41 -0300 Subject: [PATCH 10/19] fix: Types to use Option[T] --- supabase_auth/types.py | 64 +++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/supabase_auth/types.py b/supabase_auth/types.py index bf5ba2d4..956957f8 100644 --- a/supabase_auth/types.py +++ b/supabase_auth/types.py @@ -2,7 +2,7 @@ from datetime import datetime from time import time -from typing import Any, Callable, Dict, List, Union +from typing import Any, Callable, Dict, List, Union, Optional from pydantic import BaseModel, ConfigDict @@ -93,14 +93,14 @@ class InviteUserByEmailOptions(TypedDict): class AuthResponse(BaseModel): - user: Union[User, None] = None - session: Union[Session, None] = None + user: Optional[User] = None + session: Optional[Session] = None class AuthOtpResponse(BaseModel): user: None = None session: None = None - message_id: Union[str, None] = None + message_id: Optional[str] = None class OAuthResponse(BaseModel): @@ -125,12 +125,12 @@ class UserResponse(BaseModel): class Session(BaseModel): - provider_token: Union[str, None] = None + provider_token: Optional[str] = None """ The oauth provider token. If present, this can be used to make external API requests to the oauth provider used. """ - provider_refresh_token: Union[str, None] = None + provider_refresh_token: Optional[str] = None """ The oauth provider refresh token. If present, this can be used to refresh the provider_token via the oauth provider's API. @@ -146,7 +146,7 @@ class Session(BaseModel): The number of seconds until the token expires (since it was issued). Returned when a login is confirmed. """ - expires_at: Union[int, None] = None + expires_at: Optional[int] = None """ A timestamp of when the token will expire. Returned when a login is confirmed. """ @@ -168,8 +168,8 @@ class UserIdentity(BaseModel): identity_data: Dict[str, Any] provider: str created_at: datetime - last_sign_in_at: Union[datetime, None] = None - updated_at: Union[datetime, None] = None + last_sign_in_at: Optional[datetime] = None + updated_at: Optional[datetime] = None class Factor(BaseModel): @@ -181,7 +181,7 @@ class Factor(BaseModel): """ ID of the factor. """ - friendly_name: Union[str, None] = None + friendly_name: Optional[str] = None """ Friendly name of the factor, useful to disambiguate between multiple factors. """ @@ -203,25 +203,25 @@ class User(BaseModel): app_metadata: Dict[str, Any] user_metadata: Dict[str, Any] aud: str - confirmation_sent_at: Union[datetime, None] = None - recovery_sent_at: Union[datetime, None] = None - email_change_sent_at: Union[datetime, None] = None - new_email: Union[str, None] = None - new_phone: Union[str, None] = None - invited_at: Union[datetime, None] = None - action_link: Union[str, None] = None - email: Union[str, None] = None - phone: Union[str, None] = None + confirmation_sent_at: Optional[datetime] = None + recovery_sent_at: Optional[datetime] = None + email_change_sent_at: Optional[datetime] = None + new_email: Optional[str] = None + new_phone: Optional[str] = None + invited_at: Optional[datetime] = None + action_link: Optional[str] = None + email: Optional[str] = None + phone: Optional[str] = None created_at: datetime - confirmed_at: Union[datetime, None] = None - email_confirmed_at: Union[datetime, None] = None - phone_confirmed_at: Union[datetime, None] = None - last_sign_in_at: Union[datetime, None] = None - role: Union[str, None] = None - updated_at: Union[datetime, None] = None - identities: Union[List[UserIdentity], None] = None + confirmed_at: Optional[datetime] = None + email_confirmed_at: Optional[datetime] = None + phone_confirmed_at: Optional[datetime] = None + last_sign_in_at: Optional[datetime] = None + role: Optional[str] = None + updated_at: Optional[datetime] = None + identities: Optional[List[UserIdentity]] = None is_anonymous: bool = False - factors: Union[List[Factor], None] = None + factors: Optional[List[Factor]] = None class UserAttributes(TypedDict): @@ -266,7 +266,7 @@ class Subscription(BaseModel): """ The subscriber UUID. This will be set by the client. """ - callback: Callable[[AuthChangeEvent, Union[Session, None]], None] + callback: Callable[[AuthChangeEvent, Optional[Session]], None] """ The function to call every time there is an event. """ @@ -691,11 +691,11 @@ class AuthMFAListFactorsResponse(BaseModel): class AuthMFAGetAuthenticatorAssuranceLevelResponse(BaseModel): - current_level: Union[AuthenticatorAssuranceLevels, None] = None + current_level: Optional[AuthenticatorAssuranceLevels] = None """ Current AAL level of the session. """ - next_level: Union[AuthenticatorAssuranceLevels, None] = None + next_level: Optional[AuthenticatorAssuranceLevels] = None """ Next possible AAL level for the session. If the next level is higher than the current one, the user should go through MFA. @@ -778,8 +778,8 @@ class GenerateLinkResponse(BaseModel): class DecodedJWTDict(TypedDict): exp: NotRequired[int] - aal: NotRequired[Union[AuthenticatorAssuranceLevels, None]] - amr: NotRequired[Union[List[AMREntry], None]] + aal: NotRequired[Optional[AuthenticatorAssuranceLevels]] + amr: NotRequired[Optional[List[AMREntry]]] SignOutScope = Literal["global", "local", "others"] From 2ababee87679cb2c051bf8a4054ddb4f44e2abc3 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:49 -0300 Subject: [PATCH 11/19] fix: Types to use Option[T] --- tests/_async/utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/_async/utils.py b/tests/_async/utils.py index 4b8982fc..1f648197 100644 --- a/tests/_async/utils.py +++ b/tests/_async/utils.py @@ -1,6 +1,6 @@ from random import random from time import time -from typing import Union +from typing import Optional from faker import Faker from jwt import encode @@ -22,9 +22,9 @@ def mock_access_token() -> str: class OptionalCredentials(TypedDict): - email: NotRequired[Union[str, None]] - phone: NotRequired[Union[str, None]] - password: NotRequired[Union[str, None]] + email: NotRequired[Optional[str]] + phone: NotRequired[Optional[str]] + password: NotRequired[Optional[str]] class Credentials(TypedDict): @@ -64,8 +64,8 @@ def mock_app_metadata(): async def create_new_user_with_email( *, - email: Union[str, None] = None, - password: Union[str, None] = None, + email: Optional[str] = None, + password: Optional[str] = None, ) -> User: credentials = mock_user_credentials( { From 4cbcfb47c9c4c0e872d233446049e8d7f332ac11 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:42:56 -0300 Subject: [PATCH 12/19] fix: Types to use Option[T] --- tests/_sync/utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/_sync/utils.py b/tests/_sync/utils.py index a459e7ba..2cc31de2 100644 --- a/tests/_sync/utils.py +++ b/tests/_sync/utils.py @@ -1,6 +1,6 @@ from random import random from time import time -from typing import Union +from typing import Optional from faker import Faker from jwt import encode @@ -22,9 +22,9 @@ def mock_access_token() -> str: class OptionalCredentials(TypedDict): - email: NotRequired[Union[str, None]] - phone: NotRequired[Union[str, None]] - password: NotRequired[Union[str, None]] + email: NotRequired[Optional[str]] + phone: NotRequired[Optional[str]] + password: NotRequired[Optional[str]] class Credentials(TypedDict): @@ -64,8 +64,8 @@ def mock_app_metadata(): def create_new_user_with_email( *, - email: Union[str, None] = None, - password: Union[str, None] = None, + email: Optional[str] = None, + password: Optional[str] = None, ) -> User: credentials = mock_user_credentials( { From c37a501340796410ee2507487e9833631fa45e0b Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:43:58 -0300 Subject: [PATCH 13/19] fix: Types to use Option[T] --- supabase_auth/_async/gotrue_base_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/_async/gotrue_base_api.py b/supabase_auth/_async/gotrue_base_api.py index 4f027512..18468016 100644 --- a/supabase_auth/_async/gotrue_base_api.py +++ b/supabase_auth/_async/gotrue_base_api.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Callable, Dict, TypeVar, overload, Optional +from typing import Any, Callable, Dict, Optional, TypeVar, overload from httpx import Response from pydantic import BaseModel From 2332098b6f75a7b4918b063b1e50ef0a6e2b3284 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:44:05 -0300 Subject: [PATCH 14/19] fix: Types to use Option[T] --- supabase_auth/_async/gotrue_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/_async/gotrue_client.py b/supabase_auth/_async/gotrue_client.py index fe23185b..afd4b276 100644 --- a/supabase_auth/_async/gotrue_client.py +++ b/supabase_auth/_async/gotrue_client.py @@ -4,7 +4,7 @@ from functools import partial from json import loads from time import time -from typing import Callable, Dict, List, Tuple, Optional +from typing import Callable, Dict, List, Optional, Tuple from urllib.parse import parse_qs, urlencode, urlparse from uuid import uuid4 From 3c678416019c0a179ea4afe9f28bd80e09ffc36a Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:44:11 -0300 Subject: [PATCH 15/19] fix: Types to use Option[T] --- supabase_auth/_sync/gotrue_base_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/_sync/gotrue_base_api.py b/supabase_auth/_sync/gotrue_base_api.py index c494271d..bb8372ae 100644 --- a/supabase_auth/_sync/gotrue_base_api.py +++ b/supabase_auth/_sync/gotrue_base_api.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Callable, Dict, TypeVar, overload, Optional +from typing import Any, Callable, Dict, Optional, TypeVar, overload from httpx import Response from pydantic import BaseModel From 78621ffe50db5265802c7a7a066279e092a8e8e9 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:44:17 -0300 Subject: [PATCH 16/19] fix: Types to use Option[T] --- supabase_auth/_sync/gotrue_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/_sync/gotrue_client.py b/supabase_auth/_sync/gotrue_client.py index 49fecf61..6f230ed9 100644 --- a/supabase_auth/_sync/gotrue_client.py +++ b/supabase_auth/_sync/gotrue_client.py @@ -4,7 +4,7 @@ from functools import partial from json import loads from time import time -from typing import Callable, Dict, List, Tuple, Optional +from typing import Callable, Dict, List, Optional, Tuple from urllib.parse import parse_qs, urlencode, urlparse from uuid import uuid4 From c738e22b8fbc13abda7cadf861ad081f81fa7008 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:44:26 -0300 Subject: [PATCH 17/19] fix: Types to use Option[T] --- supabase_auth/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/helpers.py b/supabase_auth/helpers.py index 5eea7d47..1ac90e83 100644 --- a/supabase_auth/helpers.py +++ b/supabase_auth/helpers.py @@ -8,7 +8,7 @@ from base64 import urlsafe_b64decode from datetime import datetime from json import loads -from typing import Any, Dict, Type, TypeVar, cast, Optional +from typing import Any, Dict, Optional, Type, TypeVar, cast from httpx import HTTPStatusError, Response from pydantic import BaseModel From 9746f75eeeecc908719c1cf807c69e146bc586ba Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:44:32 -0300 Subject: [PATCH 18/19] fix: Types to use Option[T] --- supabase_auth/timer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/timer.py b/supabase_auth/timer.py index 7a1b4496..60095c20 100644 --- a/supabase_auth/timer.py +++ b/supabase_auth/timer.py @@ -1,6 +1,6 @@ import asyncio from threading import Timer as _Timer -from typing import Any, Callable, Coroutine, cast, Optional +from typing import Any, Callable, Coroutine, Optional, cast class Timer: From d90c6fdfdc249720bc55110c18a1993334557835 Mon Sep 17 00:00:00 2001 From: Juan Carlos Date: Tue, 8 Oct 2024 15:44:39 -0300 Subject: [PATCH 19/19] fix: Types to use Option[T] --- supabase_auth/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase_auth/types.py b/supabase_auth/types.py index 956957f8..86bda3e2 100644 --- a/supabase_auth/types.py +++ b/supabase_auth/types.py @@ -2,7 +2,7 @@ from datetime import datetime from time import time -from typing import Any, Callable, Dict, List, Union, Optional +from typing import Any, Callable, Dict, List, Optional, Union from pydantic import BaseModel, ConfigDict