@@ -42,10 +42,14 @@ def _get_apikey_creds():
4242 if not kaggle_json or not kaggle_json .strip ():
4343 return None
4444
45- api_key_data = json .loads (kaggle_json )
46- username = api_key_data ["username" ]
47- api_key = api_key_data ["key" ]
48- return username , api_key
45+ try :
46+ # Be careful, since the file may be used for more than credential storage.
47+ api_key_data = json .loads (kaggle_json )
48+ username = api_key_data ["username" ]
49+ api_key = api_key_data ["key" ]
50+ return username , api_key
51+ except KeyError :
52+ return None
4953
5054
5155class KaggleHttpClient (object ):
@@ -55,14 +59,14 @@ class KaggleHttpClient(object):
5559 _xsrf_header_name = "X-XSRF-TOKEN"
5660
5761 def __init__ (
58- self ,
59- env : KaggleEnv = None ,
60- verbose : bool = False ,
61- username : str = None ,
62- password : str = None ,
63- api_token : str = None ,
64- user_agent : str = "kaggle-api/v1.7.0" , # Was: V2
65- response_processor = None ,
62+ self ,
63+ env : KaggleEnv = None ,
64+ verbose : bool = False ,
65+ username : str = None ,
66+ password : str = None ,
67+ api_token : str = None ,
68+ user_agent : str = "kaggle-api/v1.7.0" , # Was: V2
69+ response_processor = None ,
6670 ):
6771 self ._env = env or get_env ()
6872 self ._signed_in = None
@@ -76,29 +80,35 @@ def __init__(
7680 self ._response_processor = response_processor
7781
7882 def call (
79- self ,
80- service_name : str ,
81- request_name : str ,
82- request : KaggleObject ,
83- response_type : Type [KaggleObject ],
83+ self ,
84+ service_name : str ,
85+ request_name : str ,
86+ request : KaggleObject ,
87+ response_type : Type [KaggleObject ],
8488 ):
8589 self ._init_session ()
8690 http_request = self ._prepare_request (service_name , request_name , request )
8791
8892 # Merge environment settings into session
89- settings = self ._session .merge_environment_settings (http_request .url , {}, None , None , None )
93+ settings = self ._session .merge_environment_settings (
94+ http_request .url , {}, None , None , None
95+ )
9096
9197 # Use stream=True for file downloads to avoid loading entire file into memory
9298 # See: https://github.com/Kaggle/kaggle-api/issues/754
93- if response_type is not None and (response_type == FileDownload or response_type == HttpRedirect ):
99+ if response_type is not None and (
100+ response_type == FileDownload or response_type == HttpRedirect
101+ ):
94102 settings ["stream" ] = True
95103
96104 http_response = self ._session .send (http_request , ** settings )
97105
98106 response = self ._prepare_response (response_type , http_response )
99107 return response
100108
101- def _prepare_request (self , service_name : str , request_name : str , request : KaggleObject ):
109+ def _prepare_request (
110+ self , service_name : str , request_name : str , request : KaggleObject
111+ ):
102112 request_url = self ._get_request_url (service_name , request_name )
103113 http_request = requests .Request (
104114 method = "POST" ,
@@ -118,7 +128,9 @@ def _prepare_response(self, response_type, http_response):
118128 if "application/json" in http_response .headers ["Content-Type" ]:
119129 resp = http_response .json ()
120130 if "code" in resp and resp ["code" ] >= 400 :
121- raise requests .exceptions .HTTPError (resp ["message" ], response = http_response )
131+ raise requests .exceptions .HTTPError (
132+ resp ["message" ], response = http_response
133+ )
122134 except KeyError :
123135 pass
124136 http_response .raise_for_status ()
@@ -133,7 +145,9 @@ def _print_request(self, request):
133145 if not self ._verbose :
134146 return
135147 self ._print ("---------------------Request----------------------" )
136- self ._print (f"{ request .method } { request .url } \n { _headers_to_str (request .headers )} \n \n { request .body } " )
148+ self ._print (
149+ f"{ request .method } { request .url } \n { _headers_to_str (request .headers )} \n \n { request .body } "
150+ )
137151 self ._print ("--------------------------------------------------" )
138152
139153 def _print_response (self , response , body = True ):
@@ -162,7 +176,9 @@ def _init_session(self):
162176 return self ._session
163177
164178 self ._session = requests .Session ()
165- self ._session .headers .update ({"User-Agent" : self ._user_agent , "Content-Type" : "application/json" })
179+ self ._session .headers .update (
180+ {"User-Agent" : self ._user_agent , "Content-Type" : "application/json" }
181+ )
166182
167183 iap_token = self ._get_iap_token_if_required ()
168184 if iap_token is not None :
@@ -203,17 +219,19 @@ def _fill_xsrf_token(self, iap_token):
203219
204220 self ._session .headers .update (
205221 {
206- KaggleHttpClient ._xsrf_header_name : self ._session .cookies [KaggleHttpClient ._xsrf_cookie_name ],
222+ KaggleHttpClient ._xsrf_header_name : self ._session .cookies [
223+ KaggleHttpClient ._xsrf_cookie_name
224+ ],
207225 }
208226 )
209227
210228 def build_start_oauth_url (
211- self ,
212- client_id : str ,
213- redirect_uri : str ,
214- scope : list [str ],
215- state : str ,
216- code_challenge : str ,
229+ self ,
230+ client_id : str ,
231+ redirect_uri : str ,
232+ scope : list [str ],
233+ state : str ,
234+ code_challenge : str ,
217235 ) -> str :
218236 params = {
219237 "response_type" : "code" ,
@@ -234,7 +252,9 @@ def get_oauth_default_redirect_url(self) -> str:
234252 return f"{ self .get_non_api_endpoint ()} /account/api/oauth/token"
235253
236254 def get_non_api_endpoint (self ) -> str :
237- return "https://www.kaggle.com" if self ._env == KaggleEnv .PROD else self ._endpoint
255+ return (
256+ "https://www.kaggle.com" if self ._env == KaggleEnv .PROD else self ._endpoint
257+ )
238258
239259 class BearerAuth (requests .auth .AuthBase ):
240260
@@ -250,7 +270,7 @@ def _try_fill_auth(self):
250270 return
251271
252272 if self ._api_token is None :
253- ( api_token , _ ) = get_access_token_from_env ()
273+ api_token , _ = get_access_token_from_env ()
254274 self ._api_token = api_token
255275
256276 if self ._api_token is not None :
@@ -272,5 +292,7 @@ def _try_fill_auth(self):
272292 def _get_request_url (self , service_name : str , request_name : str ):
273293 # On prod, API endpoints are served under https://api.kaggle.com/v1,
274294 # but on staging/admin/local, they are served under http://localhost/api/v1.
275- base_url = self ._endpoint if self ._env == KaggleEnv .PROD else f"{ self ._endpoint } /api"
295+ base_url = (
296+ self ._endpoint if self ._env == KaggleEnv .PROD else f"{ self ._endpoint } /api"
297+ )
276298 return f"{ base_url } /v1/{ service_name } /{ request_name } "
0 commit comments