1+ from metafold .auth import AuthProvider
12from requests import HTTPError , Response , Session
23from typing import Any , Callable , Optional
34from urllib .parse import urljoin
@@ -8,17 +9,28 @@ class Client:
89 """Base client."""
910
1011 def __init__ (
11- self , access_token : str , base_url : str ,
12+ self ,
13+ base_url : str ,
14+ access_token : Optional [str ] = None ,
1215 project_id : Optional [str ] = None ,
16+ auth : Optional [AuthProvider ] = None
1317 ) -> None :
18+ if bool (auth ) == bool (access_token ):
19+ raise ValueError (
20+ "Expected AuthProvider or access_token to be provided"
21+ )
22+ self ._auth = auth
1423 self ._default_project = project_id
1524 self ._base_url = base_url
1625 self ._session = Session ()
1726 self ._session .headers .update ({
1827 "Accept" : "application/json" ,
19- "Authorization" : f"Bearer { access_token } " ,
2028 "User-Agent" : f"Python/{ platform .python_version ()} " ,
2129 })
30+ if access_token :
31+ self ._session .headers .update ({
32+ "Authorization" : f"Bearer { access_token } " ,
33+ })
2234
2335 def project_id (self , id : Optional [str ] = None ) -> str :
2436 id = id or self ._default_project
@@ -28,12 +40,18 @@ def project_id(self, id: Optional[str] = None) -> str:
2840 )
2941 return id
3042
43+ def set_project_id (self , id : str ) -> None :
44+ self ._default_project = id
45+
3146 def _request (
3247 self , request : Callable [..., Response ], url : str ,
3348 * args : Any , ** kwargs : Any ,
3449 ) -> Response :
3550 url = urljoin (self ._base_url , url )
36- r : Response = request (url , * args , ** kwargs )
51+ headers = None
52+ if self ._auth :
53+ headers = {"Authorization" : f"Bearer { self ._auth .get_token ()} " }
54+ r : Response = request (url , * args , ** kwargs , headers = headers )
3755 if not r .ok :
3856 body : dict [str , Any ] = r .json ()
3957 # Error responses aren't entirely consistent in the Metafold API,
0 commit comments