1
- #!/usr/bin/python
2
- #
3
- # Copyright 2024 Kaggle Inc
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
1
+ #!/usr/bin/python
2
+ #
3
+ # Copyright 2024 Kaggle Inc
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
17
#!/usr/bin/python
18
18
#
19
19
# Copyright 2019 Kaggle Inc
56
56
from kaggle .configuration import Configuration
57
57
from kagglesdk import KaggleClient , KaggleEnv
58
58
from kagglesdk .competitions .types .competition_api_service import *
59
- from kagglesdk .datasets .types .dataset_api_service import ApiListDatasetsRequest , ApiListDatasetFilesRequest , \
60
- ApiGetDatasetStatusRequest , ApiDownloadDatasetRequest , ApiCreateDatasetRequest , ApiCreateDatasetVersionRequestBody , \
61
- ApiCreateDatasetVersionByIdRequest , ApiCreateDatasetVersionRequest , ApiDatasetNewFile
62
- from kagglesdk .datasets .types .dataset_enums import DatasetSelectionGroup , DatasetSortBy
59
+ from kagglesdk .datasets .types .dataset_api_service import ApiListDatasetsRequest , \
60
+ ApiListDatasetFilesRequest , \
61
+ ApiGetDatasetStatusRequest , ApiDownloadDatasetRequest , \
62
+ ApiCreateDatasetRequest , ApiCreateDatasetVersionRequestBody , \
63
+ ApiCreateDatasetVersionByIdRequest , ApiCreateDatasetVersionRequest , \
64
+ ApiDatasetNewFile , ApiUpdateDatasetMetadataRequest , \
65
+ ApiGetDatasetMetadataRequest
66
+ from kagglesdk .datasets .types .dataset_enums import DatasetSelectionGroup , \
67
+ DatasetSortBy , DatasetFileTypeGroup , DatasetLicenseGroup
68
+ from kagglesdk .datasets .types .dataset_types import DatasetSettings , \
69
+ SettingsLicense , UserRole , DatasetSettingsFile
70
+ from kagglesdk .kernels .types .kernels_api_service import ApiListKernelsRequest
63
71
from .kaggle_api import KaggleApi
64
72
from ..api_client import ApiClient
65
73
from ..models .api_blob_type import ApiBlobType
@@ -313,14 +321,17 @@ class KaggleApi(KaggleApi):
313
321
]
314
322
315
323
# Competitions valid types
316
- valid_competition_groups = ['general' , 'entered' , 'inClass' ]
324
+ valid_competition_groups = [
325
+ 'general' , 'entered' , 'community' , 'hosted' , 'unlaunched' ,
326
+ 'unlaunched_community'
327
+ ]
317
328
valid_competition_categories = [
318
329
'all' , 'featured' , 'research' , 'recruitment' , 'gettingStarted' , 'masters' ,
319
330
'playground'
320
331
]
321
332
valid_competition_sort_by = [
322
- 'grouped' , 'prize ' , 'earliestDeadline ' , 'latestDeadline ' , 'numberOfTeams ' ,
323
- 'recentlyCreated'
333
+ 'grouped' , 'best ' , 'prize ' , 'earliestDeadline ' , 'latestDeadline ' ,
334
+ 'numberOfTeams' , 'relevance' , ' recentlyCreated'
324
335
]
325
336
326
337
# Datasets valid types
@@ -709,6 +720,10 @@ def camel_to_snake(self, name):
709
720
name = re .sub ('(.)([A-Z][a-z]+)' , r'\1_\2' , name )
710
721
return re .sub ('([a-z0-9])([A-Z])' , r'\1_\2' , name ).lower ()
711
722
723
+ def lookup_enum (self , enum_class , item_name ):
724
+ prefix = self .camel_to_snake (enum_class .__name__ ).upper ()
725
+ return enum_class [f'{ prefix } _{ self .camel_to_snake (item_name ).upper ()} ' ]
726
+
712
727
## Competitions
713
728
714
729
def competitions_list (self ,
@@ -726,20 +741,29 @@ def competitions_list(self,
726
741
page: the page to return (default is 1)
727
742
search: a search term to use (default is empty string)
728
743
sort_by: how to sort the result, see valid_competition_sort_by for options
729
- category: category to filter result to
744
+ category: category to filter result to; use 'all' to get closed competitions
730
745
group: group to filter result to
731
746
"""
732
- if group and group not in self .valid_competition_groups :
733
- raise ValueError ('Invalid group specified. Valid options are ' +
734
- str (self .valid_competition_groups ))
747
+ if group :
748
+ if group not in self .valid_competition_groups :
749
+ raise ValueError ('Invalid group specified. Valid options are ' +
750
+ str (self .valid_competition_groups ))
751
+ if group == 'all' :
752
+ group = CompetitionListTab .COMPETITION_LIST_TAB_DEFAULT
753
+ else :
754
+ group = self .lookup_enum (CompetitionListTab , group )
735
755
736
- if category and category not in self .valid_competition_categories :
737
- raise ValueError ('Invalid category specified. Valid options are ' +
738
- str (self .valid_competition_categories ))
756
+ if category :
757
+ if category not in self .valid_competition_categories :
758
+ raise ValueError ('Invalid category specified. Valid options are ' +
759
+ str (self .valid_competition_categories ))
760
+ category = self .lookup_enum (HostSegment , category )
739
761
740
- if sort_by and sort_by not in self .valid_competition_sort_by :
741
- raise ValueError ('Invalid sort_by specified. Valid options are ' +
742
- str (self .valid_competition_sort_by ))
762
+ if sort_by :
763
+ if sort_by not in self .valid_competition_sort_by :
764
+ raise ValueError ('Invalid sort_by specified. Valid options are ' +
765
+ str (self .valid_competition_sort_by ))
766
+ sort_by = self .lookup_enum (CompetitionSortBy , sort_by )
743
767
744
768
with self .build_kaggle_client () as kaggle :
745
769
request = ApiListCompetitionsRequest ()
@@ -1199,30 +1223,36 @@ def dataset_list(self,
1199
1223
raise ValueError ('Invalid sort by specified. Valid options are ' +
1200
1224
str (self .valid_dataset_sort_bys ))
1201
1225
else :
1202
- sort_by = DatasetSortBy [ f"DATASET_SORT_BY_ { sort_by . upper () } " ]
1226
+ sort_by = self . lookup_enum ( DatasetSortBy , sort_by )
1203
1227
1204
1228
if size :
1205
1229
raise ValueError (
1206
1230
'The --size parameter has been deprecated. ' +
1207
1231
'Please use --max-size and --min-size to filter dataset sizes.' )
1208
1232
1209
- if file_type and file_type not in self .valid_dataset_file_types :
1210
- raise ValueError ('Invalid file type specified. Valid options are ' +
1211
- str (self .valid_dataset_file_types ))
1233
+ if file_type :
1234
+ if file_type not in self .valid_dataset_file_types :
1235
+ raise ValueError ('Invalid file type specified. Valid options are ' +
1236
+ str (self .valid_dataset_file_types ))
1237
+ else :
1238
+ file_type = self .lookup_enum (DatasetFileTypeGroup , file_type )
1212
1239
1213
- if license_name and license_name not in self .valid_dataset_license_names :
1214
- raise ValueError ('Invalid license specified. Valid options are ' +
1215
- str (self .valid_dataset_license_names ))
1240
+ if license_name :
1241
+ if license_name not in self .valid_dataset_license_names :
1242
+ raise ValueError ('Invalid license specified. Valid options are ' +
1243
+ str (self .valid_dataset_license_names ))
1244
+ else :
1245
+ license_name = self .lookup_enum (DatasetLicenseGroup , license_name )
1216
1246
1217
1247
if int (page ) <= 0 :
1218
1248
raise ValueError ('Page number must be >= 1' )
1219
1249
1220
1250
if max_size and min_size :
1221
- if ( int (max_size ) < int (min_size ) ):
1251
+ if int (max_size ) < int (min_size ):
1222
1252
raise ValueError ('Max Size must be max_size >= min_size' )
1223
- if ( max_size and int (max_size ) <= 0 ) :
1253
+ if max_size and int (max_size ) <= 0 :
1224
1254
raise ValueError ('Max Size must be > 0' )
1225
- elif ( min_size and int (min_size ) < 0 ) :
1255
+ elif min_size and int (min_size ) < 0 :
1226
1256
raise ValueError ('Min Size must be >= 0' )
1227
1257
1228
1258
group = DatasetSelectionGroup .DATASET_SELECTION_GROUP_PUBLIC
@@ -1315,43 +1345,57 @@ def dataset_metadata_update(self, dataset, path):
1315
1345
effective_path ) = self .dataset_metadata_prep (dataset , path )
1316
1346
meta_file = self .get_dataset_metadata_file (effective_path )
1317
1347
with open (meta_file , 'r' ) as f :
1318
- metadata = json .load (f )
1348
+ s = json .load (f )
1349
+ metadata = json .loads (s )
1319
1350
updateSettingsRequest = DatasetUpdateSettingsRequest (
1320
- title = metadata [ 'title' ] ,
1321
- subtitle = metadata [ 'subtitle' ] ,
1322
- description = metadata [ 'description' ] ,
1323
- is_private = metadata [ 'isPrivate' ] ,
1324
- licenses = [License (name = l ['name' ]) for l in metadata ['licenses' ]],
1325
- keywords = metadata [ 'keywords' ] ,
1351
+ title = metadata . get ( 'title' ) or '' ,
1352
+ subtitle = metadata . get ( 'subtitle' ) or '' ,
1353
+ description = metadata . get ( 'description' ) or '' ,
1354
+ is_private = metadata . get ( 'isPrivate' ) or False ,
1355
+ licenses = [License (name = l ['name' ]) for l in metadata ['licenses' ]] if metadata . get ( 'licenses' ) else [] ,
1356
+ keywords = metadata . get ( 'keywords' ) ,
1326
1357
collaborators = [
1327
- Collaborator (username = c ['username' ], role = c ['role' ])
1328
- for c in metadata ['collaborators' ]
1329
- ],
1330
- data = metadata [ 'data' ] )
1358
+ Collaborator (username = c ['username' ], role = c ['role' ])
1359
+ for c in metadata ['collaborators' ]
1360
+ ] if metadata . get ( 'collaborators' ) else [ ],
1361
+ data = metadata . get ( 'data' ) )
1331
1362
result = self .process_response (
1332
1363
self .metadata_post_with_http_info (owner_slug , dataset_slug ,
1333
1364
updateSettingsRequest ))
1334
1365
if (len (result ['errors' ]) > 0 ):
1335
1366
[print (e ['message' ]) for e in result ['errors' ]]
1336
1367
exit (1 )
1337
1368
1369
+ def new_license (self , name ):
1370
+ slicense = SettingsLicense ()
1371
+ slicense .name = name
1372
+ return slicense
1373
+
1374
+ def new_collaborator (self , name , role ):
1375
+ collab = UserRole ()
1376
+ collab .username = name
1377
+ collab .role = role
1378
+ return collab
1379
+
1338
1380
def dataset_metadata (self , dataset , path ):
1339
1381
(owner_slug , dataset_slug ,
1340
1382
effective_path ) = self .dataset_metadata_prep (dataset , path )
1341
1383
1342
1384
if not os .path .exists (effective_path ):
1343
1385
os .makedirs (effective_path )
1344
1386
1345
- result = self .process_response (
1346
- self .metadata_get_with_http_info (owner_slug , dataset_slug ))
1347
- if (result ['errorMessage' ]):
1348
- raise Exception (result ['errorMessage' ])
1349
-
1350
- metadata = Metadata (result ['info' ])
1387
+ with self .build_kaggle_client () as kaggle :
1388
+ request = ApiGetDatasetMetadataRequest ()
1389
+ request .owner_slug = owner_slug
1390
+ request .dataset_slug = dataset_slug
1391
+ response = kaggle .datasets .dataset_api_client .get_dataset_metadata (
1392
+ request )
1393
+ if response .error_message :
1394
+ raise Exception (response .error_message )
1351
1395
1352
1396
meta_file = os .path .join (effective_path , self .DATASET_METADATA_FILE )
1353
1397
with open (meta_file , 'w' ) as f :
1354
- json .dump (metadata , f , indent = 2 , default = lambda o : o .__dict__ )
1398
+ json .dump (response . to_json ( response . info ) , f , indent = 2 , default = lambda o : o .__dict__ )
1355
1399
1356
1400
return meta_file
1357
1401
@@ -2109,7 +2153,7 @@ def kernels_list(self,
2109
2153
kernel_type = None ,
2110
2154
output_type = None ,
2111
2155
sort_by = None ):
2112
- """ list kernels based on a set of search criteria
2156
+ """ List kernels based on a set of search criteria.
2113
2157
2114
2158
Parameters
2115
2159
==========
@@ -2161,6 +2205,21 @@ def kernels_list(self,
2161
2205
if mine :
2162
2206
group = 'profile'
2163
2207
2208
+ with self .build_kaggle_client () as kaggle :
2209
+ request = ApiListKernelsRequest ()
2210
+ request .page = page
2211
+ page_size = page_size
2212
+ group = group # req
2213
+ user = user
2214
+ language = language
2215
+ kernel_type = kernel_type
2216
+ output_type = output_type
2217
+ sort_by = sort_by #req
2218
+ dataset = dataset
2219
+ competition = competition
2220
+ parent_kernel = parent_kernel
2221
+ search = search
2222
+
2164
2223
kernels_list_result = self .process_response (
2165
2224
self .kernels_list_with_http_info (
2166
2225
page = page ,
0 commit comments