Skip to content

Commit 5f43552

Browse files
authored
Update new code to match new endpoint after its code review (#706)
I *still* need to add a new test for the new API method. Reminder: `kagglesdk` is generated.
1 parent 8fef673 commit 5f43552

File tree

9 files changed

+505
-378
lines changed

9 files changed

+505
-378
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
Changelog
22
====
3+
### 1.7.3b2
4+
5+
* Added the ability to submit to a code competition. Some required arguments have been made optional.
6+
* Added a `--timeout` option to `kaggle kernels push` to limit the run-time to the specified number of seconds.
7+
38
### 1.7.3b1
49

510
* Fix escaped-quote issue in HTTP requests.

kaggle/api/kaggle_api_extended.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -794,41 +794,47 @@ def competitions_list_cli(self,
794794
else:
795795
print('No competitions found')
796796

797-
def competition_submit_code(self, file_name, message, competition, kernel_slug=None, kernel_version=None, quiet=False):
798-
""" Submit a competition.
797+
def competition_submit_code(self, file_name, message, competition, kernel=None, kernel_version=None, quiet=False):
798+
""" Submit to a code competition.
799799
800800
Parameters
801801
==========
802-
file_name: the name of the output file created by the kernel
802+
file_name: the name of the output file created by the kernel (not used for packages)
803803
message: the submission description
804804
competition: the competition name; if not given use the 'competition' config value
805-
kernel_slug: the <owner>/<notebook> of the notebook to use for a code competition
805+
kernel: the <owner>/<notebook> of the notebook to use for a code competition
806806
kernel_version: the version number, returned by 'kaggle kernels push ...'
807807
quiet: suppress verbose output (default is False)
808808
"""
809809
if competition is None:
810810
competition = self.get_config_value(self.CONFIG_NAME_COMPETITION)
811811
if competition is not None and not quiet:
812812
print('Using competition: ' + competition)
813-
814813
if competition is None:
815814
raise ValueError('No competition specified')
815+
816+
if kernel is None:
817+
raise ValueError('No kernel specified')
816818
else:
817-
if kernel_version is None:
818-
raise ValueError('Kernel version must be specified')
819819
with self.build_kaggle_client() as kaggle:
820+
items = kernel.split('/')
821+
if len(items) != 2:
822+
raise ValueError('The kernel must be specified as <owner>/<notebook>')
820823
submit_request = ApiCreateCodeSubmissionRequest()
821824
submit_request.file_name = file_name
822825
submit_request.competition_name = competition
823-
submit_request.kernel_slug = kernel_slug
824-
submit_request.kernel_version = kernel_version
825-
submit_request.submission_description = message
826+
submit_request._kernel_owner = items[0]
827+
submit_request.kernel_slug = items[1]
828+
if kernel_version:
829+
submit_request.kernel_version = int(kernel_version)
830+
if message:
831+
submit_request.submission_description = message
826832
submit_response = kaggle.competitions.competition_api_client.create_code_submission(
827833
submit_request)
828834
return submit_response
829835

830836
def competition_submit(self, file_name, message, competition, quiet=False):
831-
""" Submit a competition.
837+
""" Submit to a competition.
832838
833839
Parameters
834840
==========
@@ -845,6 +851,8 @@ def competition_submit(self, file_name, message, competition, quiet=False):
845851
if competition is None:
846852
raise ValueError('No competition specified')
847853
else:
854+
if file_name is None:
855+
raise ValueError('No file specified')
848856
with self.build_kaggle_client() as kaggle:
849857
request = ApiStartSubmissionUploadRequest()
850858
request.competition_name = competition
@@ -863,15 +871,16 @@ def competition_submit(self, file_name, message, competition, quiet=False):
863871
submit_request = ApiCreateSubmissionRequest()
864872
submit_request.competition_name = competition
865873
submit_request.blob_file_tokens = response.token
866-
submit_request.submission_description = message
874+
if message:
875+
submit_request.submission_description = message
867876
submit_response = kaggle.competitions.competition_api_client.create_submission(
868877
submit_request)
869878
return submit_response
870879

871880
def competition_submit_cli(self,
872-
file_name,
873-
message,
874-
competition,
881+
file_name=None,
882+
message=None,
883+
competition=None,
875884
kernel=None,
876885
version=None,
877886
competition_opt=None,

kaggle/cli.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,6 @@ def parse_competitions(subparsers):
234234
help=Help.command_competitions_submit)
235235
parser_competitions_submit_optional = parser_competitions_submit._action_groups.pop(
236236
)
237-
parser_competitions_submit_required = parser_competitions_submit.add_argument_group(
238-
'required arguments')
239237
parser_competitions_submit_optional.add_argument(
240238
'competition', nargs='?', default=None, help=Help.param_competition)
241239
parser_competitions_submit_optional.add_argument(
@@ -244,11 +242,11 @@ def parse_competitions(subparsers):
244242
dest='competition_opt',
245243
required=False,
246244
help=argparse.SUPPRESS)
247-
parser_competitions_submit_required.add_argument(
245+
parser_competitions_submit_optional.add_argument(
248246
'-f', '--file', dest='file_name', help=Help.param_upfile)
249247
parser_competitions_submit_optional.add_argument(
250248
'-k', '--kernel', dest='kernel', help=Help.param_code_kernel)
251-
parser_competitions_submit_required.add_argument(
249+
parser_competitions_submit_optional.add_argument(
252250
'-m',
253251
'--message',
254252
dest='message',

kagglesdk/competitions/services/competition_api_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from kagglesdk.common.types.file_download import FileDownload
22
from kagglesdk.common.types.http_redirect import HttpRedirect
3-
from kagglesdk.competitions.types.competition_api_service import ApiCreateCodeSubmissionRequest, ApiCreateSubmissionRequest, ApiCreateSubmissionResponse, ApiDownloadDataFileRequest, ApiDownloadDataFilesRequest, ApiDownloadLeaderboardRequest, ApiGetLeaderboardRequest, ApiGetLeaderboardResponse, ApiGetSubmissionRequest, ApiListCompetitionsRequest, ApiListCompetitionsResponse, ApiListDataFilesRequest, ApiListDataFilesResponse, ApiListSubmissionsRequest, ApiListSubmissionsResponse, ApiStartSubmissionUploadRequest, ApiStartSubmissionUploadResponse, ApiSubmission
3+
from kagglesdk.competitions.types.competition_api_service import ApiCreateCodeSubmissionRequest, ApiCreateCodeSubmissionResponse, ApiCreateSubmissionRequest, ApiCreateSubmissionResponse, ApiDownloadDataFileRequest, ApiDownloadDataFilesRequest, ApiDownloadLeaderboardRequest, ApiGetLeaderboardRequest, ApiGetLeaderboardResponse, ApiGetSubmissionRequest, ApiListCompetitionsRequest, ApiListCompetitionsResponse, ApiListDataFilesRequest, ApiListDataFilesResponse, ApiListSubmissionsRequest, ApiListSubmissionsResponse, ApiStartSubmissionUploadRequest, ApiStartSubmissionUploadResponse, ApiSubmission
44
from kagglesdk.kaggle_http_client import KaggleHttpClient
55

66
class CompetitionApiClient(object):
@@ -80,7 +80,7 @@ def create_submission(self, request: ApiCreateSubmissionRequest = None) -> ApiCr
8080

8181
return self._client.call("competitions.CompetitionApiService", "ApiCreateSubmission", request, ApiCreateSubmissionResponse)
8282

83-
def create_code_submission(self, request: ApiCreateCodeSubmissionRequest = None) -> ApiCreateSubmissionResponse:
83+
def create_code_submission(self, request: ApiCreateCodeSubmissionRequest = None) -> ApiCreateCodeSubmissionResponse:
8484
r"""
8585
Args:
8686
request (ApiCreateCodeSubmissionRequest):
@@ -90,7 +90,7 @@ def create_code_submission(self, request: ApiCreateCodeSubmissionRequest = None)
9090
if request is None:
9191
request = ApiCreateCodeSubmissionRequest()
9292

93-
return self._client.call("competitions.CompetitionApiService", "ApiCreateCodeSubmission", request, ApiCreateSubmissionResponse)
93+
return self._client.call("competitions.CompetitionApiService", "ApiCreateCodeSubmission", request, ApiCreateCodeSubmissionResponse)
9494

9595
def get_submission(self, request: ApiGetSubmissionRequest = None) -> ApiSubmission:
9696
r"""

kagglesdk/competitions/types/competition_api_service.py

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ class ApiCreateCodeSubmissionRequest(KaggleObject):
88
r"""
99
Attributes:
1010
competition_name (str)
11+
kernel_owner (str)
1112
kernel_slug (str)
12-
kernel_version (str)
13+
kernel_version (int)
1314
file_name (str)
1415
submission_description (str)
1516
"""
1617

1718
def __init__(self):
1819
self._competition_name = ""
20+
self._kernel_owner = ""
1921
self._kernel_slug = ""
20-
self._kernel_version = ""
21-
self._file_name = ""
22+
self._kernel_version = None
23+
self._file_name = None
2224
self._submission_description = None
2325
self._freeze()
2426

@@ -35,6 +37,19 @@ def competition_name(self, competition_name: str):
3537
raise TypeError('competition_name must be of type str')
3638
self._competition_name = competition_name
3739

40+
@property
41+
def kernel_owner(self) -> str:
42+
return self._kernel_owner
43+
44+
@kernel_owner.setter
45+
def kernel_owner(self, kernel_owner: str):
46+
if kernel_owner is None:
47+
del self.kernel_owner
48+
return
49+
if not isinstance(kernel_owner, str):
50+
raise TypeError('kernel_owner must be of type str')
51+
self._kernel_owner = kernel_owner
52+
3853
@property
3954
def kernel_slug(self) -> str:
4055
return self._kernel_slug
@@ -49,21 +64,21 @@ def kernel_slug(self, kernel_slug: str):
4964
self._kernel_slug = kernel_slug
5065

5166
@property
52-
def kernel_version(self) -> str:
53-
return self._kernel_version
67+
def kernel_version(self) -> int:
68+
return self._kernel_version or 0
5469

5570
@kernel_version.setter
56-
def kernel_version(self, kernel_version: str):
71+
def kernel_version(self, kernel_version: int):
5772
if kernel_version is None:
5873
del self.kernel_version
5974
return
60-
if not isinstance(kernel_version, str):
61-
raise TypeError('kernel_version must be of type str')
75+
if not isinstance(kernel_version, int):
76+
raise TypeError('kernel_version must be of type int')
6277
self._kernel_version = kernel_version
6378

6479
@property
6580
def file_name(self) -> str:
66-
return self._file_name
81+
return self._file_name or ""
6782

6883
@file_name.setter
6984
def file_name(self, file_name: str):
@@ -97,6 +112,45 @@ def method():
97112
return 'POST'
98113

99114

115+
class ApiCreateCodeSubmissionResponse(KaggleObject):
116+
r"""
117+
Attributes:
118+
message (str)
119+
ref (int)
120+
"""
121+
122+
def __init__(self):
123+
self._message = ""
124+
self._ref = 0
125+
self._freeze()
126+
127+
@property
128+
def message(self) -> str:
129+
return self._message
130+
131+
@message.setter
132+
def message(self, message: str):
133+
if message is None:
134+
del self.message
135+
return
136+
if not isinstance(message, str):
137+
raise TypeError('message must be of type str')
138+
self._message = message
139+
140+
@property
141+
def ref(self) -> int:
142+
return self._ref
143+
144+
@ref.setter
145+
def ref(self, ref: int):
146+
if ref is None:
147+
del self.ref
148+
return
149+
if not isinstance(ref, int):
150+
raise TypeError('ref must be of type int')
151+
self._ref = ref
152+
153+
100154
class ApiCreateSubmissionRequest(KaggleObject):
101155
r"""
102156
Attributes:
@@ -170,8 +224,6 @@ class ApiCreateSubmissionResponse(KaggleObject):
170224
r"""
171225
Attributes:
172226
message (str)
173-
TODO: Remove when we feel okay with the breaking change, this adds no
174-
value.
175227
ref (int)
176228
"""
177229

@@ -182,10 +234,6 @@ def __init__(self):
182234

183235
@property
184236
def message(self) -> str:
185-
r"""
186-
TODO: Remove when we feel okay with the breaking change, this adds no
187-
value.
188-
"""
189237
return self._message
190238

191239
@message.setter
@@ -1814,12 +1862,18 @@ def total_count(self, total_count: int):
18141862

18151863
ApiCreateCodeSubmissionRequest._fields = [
18161864
FieldMetadata("competitionName", "competition_name", "_competition_name", str, "", PredefinedSerializer()),
1865+
FieldMetadata("kernelOwner", "kernel_owner", "_kernel_owner", str, "", PredefinedSerializer()),
18171866
FieldMetadata("kernelSlug", "kernel_slug", "_kernel_slug", str, "", PredefinedSerializer()),
1818-
FieldMetadata("kernelVersion", "kernel_version", "_kernel_version", str, "", PredefinedSerializer()),
1819-
FieldMetadata("fileName", "file_name", "_file_name", str, "", PredefinedSerializer()),
1867+
FieldMetadata("kernelVersion", "kernel_version", "_kernel_version", int, None, PredefinedSerializer(), optional=True),
1868+
FieldMetadata("fileName", "file_name", "_file_name", str, None, PredefinedSerializer(), optional=True),
18201869
FieldMetadata("submissionDescription", "submission_description", "_submission_description", str, None, PredefinedSerializer(), optional=True),
18211870
]
18221871

1872+
ApiCreateCodeSubmissionResponse._fields = [
1873+
FieldMetadata("message", "message", "_message", str, "", PredefinedSerializer()),
1874+
FieldMetadata("ref", "ref", "_ref", int, 0, PredefinedSerializer()),
1875+
]
1876+
18231877
ApiCreateSubmissionRequest._fields = [
18241878
FieldMetadata("competitionName", "competition_name", "_competition_name", str, "", PredefinedSerializer()),
18251879
FieldMetadata("blobFileTokens", "blob_file_tokens", "_blob_file_tokens", str, "", PredefinedSerializer()),

0 commit comments

Comments
 (0)