Skip to content

Commit 2f07cfc

Browse files
authored
Fix dropped handler code and reformat (#64)
Actually, the formatting is controlled by the code generator, but several files were changed that have only differences in format.
1 parent c77325b commit 2f07cfc

3 files changed

Lines changed: 376 additions & 323 deletions

File tree

kagglesdk/competitions/types/hackathons.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from kagglesdk.competitions.types.competition_enums import HackathonTrackPrizeType
23
from kagglesdk.competitions.types.team import Team
34
from kagglesdk.discussions.types.writeup_types import WriteUp
@@ -204,6 +205,7 @@ class HackathonWriteUp(KaggleObject):
204205
should_create_doi (bool)
205206
Whether or not the user indicated a DOI should be created for the hackathon
206207
writeup when the competition closes.
208+
update_time (datetime)
207209
"""
208210

209211
def __init__(self):
@@ -217,6 +219,7 @@ def __init__(self):
217219
self._owner_host_user_id = None
218220
self._owner_judge_user_id = None
219221
self._should_create_doi = None
222+
self._update_time = None
220223
self._freeze()
221224

222225
@property
@@ -357,6 +360,18 @@ def should_create_doi(self, should_create_doi: Optional[bool]):
357360
raise TypeError('should_create_doi must be of type bool')
358361
self._should_create_doi = should_create_doi
359362

363+
@property
364+
def update_time(self) -> datetime:
365+
return self._update_time or None
366+
367+
@update_time.setter
368+
def update_time(self, update_time: Optional[datetime]):
369+
if update_time is None:
370+
del self.update_time
371+
return
372+
if not isinstance(update_time, datetime):
373+
raise TypeError('update_time must be of type datetime')
374+
self._update_time = update_time
360375

361376
HackathonTrack._fields = [
362377
FieldMetadata("id", "id", "_id", int, 0, PredefinedSerializer()),
@@ -386,5 +401,6 @@ def should_create_doi(self, should_create_doi: Optional[bool]):
386401
FieldMetadata("ownerHostUserId", "owner_host_user_id", "_owner_host_user_id", int, None, PredefinedSerializer(), optional=True),
387402
FieldMetadata("ownerJudgeUserId", "owner_judge_user_id", "_owner_judge_user_id", int, None, PredefinedSerializer(), optional=True),
388403
FieldMetadata("shouldCreateDoi", "should_create_doi", "_should_create_doi", bool, None, PredefinedSerializer(), optional=True),
404+
FieldMetadata("updateTime", "update_time", "_update_time", datetime, None, DateTimeSerializer(), optional=True),
389405
]
390406

kagglesdk/kaggle_http_client.py

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5155
class 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

Comments
 (0)