kaggle 1.7.4.1__py3-none-any.whl → 1.7.4.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kaggle/api/kaggle_api.py +92 -79
- kaggle/api/kaggle_api_extended.py +909 -878
- kaggle/configuration.py +3 -3
- kaggle/models/dataset_column.py +58 -49
- kaggle/models/dataset_new_request.py +47 -31
- kaggle/models/dataset_new_version_request.py +56 -31
- kaggle/models/dataset_update_settings_request.py +58 -32
- kaggle/models/kernel_push_request.py +86 -51
- kaggle/models/model_instance_new_version_request.py +20 -12
- kaggle/models/model_instance_update_request.py +68 -37
- kaggle/models/model_new_instance_request.py +85 -47
- kaggle/models/model_new_request.py +26 -19
- kaggle/models/model_update_request.py +34 -23
- kaggle/models/start_blob_upload_request.py +60 -49
- kaggle/models/start_blob_upload_response.py +27 -22
- kaggle/models/upload_file.py +33 -31
- {kaggle-1.7.4.1.dist-info → kaggle-1.7.4.5.dist-info}/METADATA +1 -1
- {kaggle-1.7.4.1.dist-info → kaggle-1.7.4.5.dist-info}/RECORD +40 -31
- kagglesdk/__init__.py +1 -1
- kagglesdk/datasets/types/dataset_api_service.py +16 -0
- kagglesdk/kaggle_client.py +12 -0
- kagglesdk/kaggle_env.py +9 -11
- kagglesdk/kaggle_http_client.py +91 -56
- kagglesdk/kaggle_object.py +97 -42
- kagglesdk/kernels/types/kernels_api_service.py +24 -0
- kagglesdk/models/services/model_api_service.py +7 -6
- kagglesdk/models/types/model_api_service.py +31 -15
- kagglesdk/security/__init__.py +0 -0
- kagglesdk/security/services/__init__.py +0 -0
- kagglesdk/security/services/oauth_service.py +32 -0
- kagglesdk/security/types/__init__.py +0 -0
- kagglesdk/security/types/authentication.py +171 -0
- kagglesdk/security/types/oauth_service.py +394 -0
- kagglesdk/test/test_client.py +4 -6
- kagglesdk/users/services/__init__.py +0 -0
- kagglesdk/users/services/account_service.py +19 -0
- kagglesdk/users/types/account_service.py +204 -0
- {kaggle-1.7.4.1.dist-info → kaggle-1.7.4.5.dist-info}/WHEEL +0 -0
- {kaggle-1.7.4.1.dist-info → kaggle-1.7.4.5.dist-info}/entry_points.txt +0 -0
- {kaggle-1.7.4.1.dist-info → kaggle-1.7.4.5.dist-info}/licenses/LICENSE.txt +0 -0
kaggle/models/upload_file.py
CHANGED
|
@@ -61,75 +61,77 @@ class UploadFile(object):
|
|
|
61
61
|
|
|
62
62
|
@property
|
|
63
63
|
def token(self):
|
|
64
|
-
"""Gets the token of this UploadFile. # noqa: E501
|
|
64
|
+
"""Gets the token of this UploadFile. # noqa: E501.
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
A token referencing a specific file upload that can be used across
|
|
67
|
+
requests # noqa: E501
|
|
67
68
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
:return: The token of this UploadFile. # noqa: E501
|
|
70
|
+
:rtype: str
|
|
71
|
+
"""
|
|
71
72
|
return self._token
|
|
72
73
|
|
|
73
74
|
@token.setter
|
|
74
75
|
def token(self, token):
|
|
75
76
|
"""Sets the token of this UploadFile.
|
|
76
77
|
|
|
77
|
-
|
|
78
|
+
A token referencing a specific file upload that can be used across
|
|
79
|
+
requests # noqa: E501
|
|
78
80
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
:param token: The token of this UploadFile. # noqa: E501
|
|
82
|
+
:type: str
|
|
83
|
+
"""
|
|
82
84
|
|
|
83
85
|
self._token = token
|
|
84
86
|
|
|
85
87
|
@property
|
|
86
88
|
def description(self):
|
|
87
|
-
"""Gets the description of this UploadFile. # noqa: E501
|
|
89
|
+
"""Gets the description of this UploadFile. # noqa: E501.
|
|
88
90
|
|
|
89
|
-
|
|
91
|
+
The file description # noqa: E501
|
|
90
92
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
:return: The description of this UploadFile. # noqa: E501
|
|
94
|
+
:rtype: str
|
|
95
|
+
"""
|
|
94
96
|
return self._description
|
|
95
97
|
|
|
96
98
|
@description.setter
|
|
97
99
|
def description(self, description):
|
|
98
100
|
"""Sets the description of this UploadFile.
|
|
99
101
|
|
|
100
|
-
|
|
102
|
+
The file description # noqa: E501
|
|
101
103
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
:param description: The description of this UploadFile. # noqa: E501
|
|
105
|
+
:type: str
|
|
106
|
+
"""
|
|
105
107
|
|
|
106
108
|
self._description = description
|
|
107
109
|
|
|
108
110
|
@property
|
|
109
111
|
def columns(self):
|
|
110
|
-
"""Gets the columns of this UploadFile. # noqa: E501
|
|
112
|
+
"""Gets the columns of this UploadFile. # noqa: E501.
|
|
111
113
|
|
|
112
|
-
|
|
114
|
+
A list of dataset column metadata # noqa: E501
|
|
113
115
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
:return: The columns of this UploadFile. # noqa: E501
|
|
117
|
+
:rtype: list[DatasetColumn]
|
|
118
|
+
"""
|
|
117
119
|
return self._columns
|
|
118
120
|
|
|
119
121
|
@columns.setter
|
|
120
122
|
def columns(self, columns):
|
|
121
123
|
"""Sets the columns of this UploadFile.
|
|
122
124
|
|
|
123
|
-
|
|
125
|
+
A list of dataset column metadata # noqa: E501
|
|
124
126
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
:param columns: The columns of this UploadFile. # noqa: E501
|
|
128
|
+
:type: list[DatasetColumn]
|
|
129
|
+
"""
|
|
128
130
|
|
|
129
131
|
self._columns = columns
|
|
130
132
|
|
|
131
133
|
def to_dict(self):
|
|
132
|
-
"""Returns the model properties as a dict"""
|
|
134
|
+
"""Returns the model properties as a dict."""
|
|
133
135
|
result = {}
|
|
134
136
|
|
|
135
137
|
for attr, _ in six.iteritems(self.column_types):
|
|
@@ -150,7 +152,7 @@ class UploadFile(object):
|
|
|
150
152
|
return result
|
|
151
153
|
|
|
152
154
|
def to_str(self):
|
|
153
|
-
"""Returns the string representation of the model"""
|
|
155
|
+
"""Returns the string representation of the model."""
|
|
154
156
|
return pprint.pformat(self.to_dict())
|
|
155
157
|
|
|
156
158
|
def __repr__(self):
|
|
@@ -158,12 +160,12 @@ class UploadFile(object):
|
|
|
158
160
|
return self.to_str()
|
|
159
161
|
|
|
160
162
|
def __eq__(self, other):
|
|
161
|
-
"""Returns true if both objects are equal"""
|
|
163
|
+
"""Returns true if both objects are equal."""
|
|
162
164
|
if not isinstance(other, UploadFile):
|
|
163
165
|
return False
|
|
164
166
|
|
|
165
167
|
return self.__dict__ == other.__dict__
|
|
166
168
|
|
|
167
169
|
def __ne__(self, other):
|
|
168
|
-
"""Returns true if both objects are not equal"""
|
|
170
|
+
"""Returns true if both objects are not equal."""
|
|
169
171
|
return not self == other
|
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
kaggle/LICENSE,sha256=PN5H3cwV3xW9nvUXKcB_XOH60cWqne6qK3SAE8NI74s,11340
|
|
2
2
|
kaggle/__init__.py,sha256=XFAbsmBy7kvlQrRhwEl2f8sb0-RdaLOieLQsX0CkEHU,151
|
|
3
3
|
kaggle/cli.py,sha256=xhlpnWLtKAUG2m3baqODIX-1Lev4Un2IoHLDHbGU06E,63718
|
|
4
|
-
kaggle/configuration.py,sha256=
|
|
4
|
+
kaggle/configuration.py,sha256=hBzQMHXNIbcPc2sak9Px7kGmI5TyBM5Q5oD6AayRnv4,6072
|
|
5
5
|
kaggle/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
kaggle/api/kaggle_api.py,sha256=
|
|
7
|
-
kaggle/api/kaggle_api_extended.py,sha256=
|
|
6
|
+
kaggle/api/kaggle_api.py,sha256=bHR81Iv1dvnFa3AxmPDCyItrA62iqPiC0wgH2CQh6bQ,24682
|
|
7
|
+
kaggle/api/kaggle_api_extended.py,sha256=ahoxcfNGrqeWUPUo906HW-G1dFtDkdOuALh_x03pyNg,181049
|
|
8
8
|
kaggle/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
kaggle/models/api_blob_type.py,sha256=wLxLS86hWWlCM-cad4WITBiUEIVNkBbclJ7sZm72u0A,85
|
|
10
|
-
kaggle/models/dataset_column.py,sha256=
|
|
11
|
-
kaggle/models/dataset_new_request.py,sha256=
|
|
12
|
-
kaggle/models/dataset_new_version_request.py,sha256=
|
|
13
|
-
kaggle/models/dataset_update_settings_request.py,sha256=
|
|
10
|
+
kaggle/models/dataset_column.py,sha256=BqX82R28fkzxYqtv09pyc4-O4Nt9PTIM9cZVLI4B2U4,6665
|
|
11
|
+
kaggle/models/dataset_new_request.py,sha256=FfYLk02PPW03ptO6U7hnm1EEoiscGuqHFVc1AoHjpOA,12357
|
|
12
|
+
kaggle/models/dataset_new_version_request.py,sha256=qptalzvSPEgr_2hYerl26dQ5_YJL0-gYghmddiQhL0U,9585
|
|
13
|
+
kaggle/models/dataset_update_settings_request.py,sha256=5NWbEERm34ZMqcGusRbd2jlQtmC0GXHHiXyS4XkYRQE,9694
|
|
14
14
|
kaggle/models/kaggle_models_extended.py,sha256=5H0dPscq8A9NJN-FTCBkUUTpuz1hj6eKtW5w3C-QcHU,7431
|
|
15
|
-
kaggle/models/kernel_push_request.py,sha256=
|
|
16
|
-
kaggle/models/model_instance_new_version_request.py,sha256=
|
|
17
|
-
kaggle/models/model_instance_update_request.py,sha256=
|
|
18
|
-
kaggle/models/model_new_instance_request.py,sha256=
|
|
19
|
-
kaggle/models/model_new_request.py,sha256=
|
|
20
|
-
kaggle/models/model_update_request.py,sha256=
|
|
21
|
-
kaggle/models/start_blob_upload_request.py,sha256=
|
|
22
|
-
kaggle/models/start_blob_upload_response.py,sha256=
|
|
23
|
-
kaggle/models/upload_file.py,sha256=
|
|
15
|
+
kaggle/models/kernel_push_request.py,sha256=SJVk5M6aqTB0wx1es6rhvpCc72jDIUUJejGbnMKo-Jo,19629
|
|
16
|
+
kaggle/models/model_instance_new_version_request.py,sha256=3F__pc8dQcfj_SVvhhrFaSroBckKxvnGT4_ym2PZhXY,4608
|
|
17
|
+
kaggle/models/model_instance_update_request.py,sha256=2KTM1o_6ng_H2Ti9wVo0lEh54_OScwNhOWCjxmRuKSk,13933
|
|
18
|
+
kaggle/models/model_new_instance_request.py,sha256=Ll2Yu3syLrHGi8vAa4CGsshVNSW0rRLLJZXNC8es_rI,16449
|
|
19
|
+
kaggle/models/model_new_request.py,sha256=916-XfsshreGW2Tsst3lu5U8i7iANKsEraN_TqQq02s,9465
|
|
20
|
+
kaggle/models/model_update_request.py,sha256=SaM0BHwRq3x0ax6pJuBs0NBxuLnfSCi2vzRFXqcvU_w,8573
|
|
21
|
+
kaggle/models/start_blob_upload_request.py,sha256=Cqx1KLjerB2huky7AmvbJRBDuykHOWKPBBnYhzg2his,7141
|
|
22
|
+
kaggle/models/start_blob_upload_response.py,sha256=AC5vtuCkl2MUZcH_S_rtBx7sPSxeL6az176Qv284VXk,4173
|
|
23
|
+
kaggle/models/upload_file.py,sha256=tbYnmnU3ytvJMCRiSLN0YvbaAVd1NNy2ibiVgI2wBwc,4707
|
|
24
24
|
kaggle/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
25
25
|
kaggle/test/test_authenticate.py,sha256=tO71JieT3adp1DixfKo1G53CByEhai2VwNxWVE4RhPY,1111
|
|
26
26
|
kagglesdk/LICENSE,sha256=PN5H3cwV3xW9nvUXKcB_XOH60cWqne6qK3SAE8NI74s,11340
|
|
27
|
-
kagglesdk/__init__.py,sha256=
|
|
28
|
-
kagglesdk/kaggle_client.py,sha256=
|
|
29
|
-
kagglesdk/kaggle_env.py,sha256=
|
|
30
|
-
kagglesdk/kaggle_http_client.py,sha256=
|
|
31
|
-
kagglesdk/kaggle_object.py,sha256=
|
|
27
|
+
kagglesdk/__init__.py,sha256=ASJl7410iRr3Dyd4cKYEzxVvU2QByf-ayg4lCJ-J2EY,92
|
|
28
|
+
kagglesdk/kaggle_client.py,sha256=PtjqWQXMFzQmUyqKAaIrbImNcKH08f0f16NcPZQaCUs,3283
|
|
29
|
+
kagglesdk/kaggle_env.py,sha256=j8maAydT3K1wkOIw0daNF2fL1IiqSCpGgDLm3YwSkp4,1072
|
|
30
|
+
kagglesdk/kaggle_http_client.py,sha256=SWcF5cjEvHuATwZizg-AqaG_m3FLHPsIZlVCnFo3XB0,10539
|
|
31
|
+
kagglesdk/kaggle_object.py,sha256=h4J7nA6ZCnzrqhrCdYSxaQ7T6VeSEKQpoOjcWLHyRkM,10703
|
|
32
32
|
kagglesdk/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
33
|
kagglesdk/admin/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
kagglesdk/admin/services/inbox_file_service.py,sha256=dbNqDOZChTWolt9eP39M8dPg7AXEXWIwgjLgV8thsik,777
|
|
@@ -54,7 +54,7 @@ kagglesdk/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
|
|
|
54
54
|
kagglesdk/datasets/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
55
|
kagglesdk/datasets/services/dataset_api_service.py,sha256=yhFRkYyRW5fadR6frqoZwdztVJcURMSRZtj3xtqevQU,6862
|
|
56
56
|
kagglesdk/datasets/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
|
-
kagglesdk/datasets/types/dataset_api_service.py,sha256=
|
|
57
|
+
kagglesdk/datasets/types/dataset_api_service.py,sha256=IcGQXDagC1uRT7EbV8Htac1rrdcx8U8sO2PvGy2NABQ,80854
|
|
58
58
|
kagglesdk/datasets/types/dataset_enums.py,sha256=LvroQzkG1gHC1XNUN6pRH5ZMi-nlAJ2DJMQuSrwu-Tk,2355
|
|
59
59
|
kagglesdk/datasets/types/dataset_types.py,sha256=U0QDSMa17uG_4zdfLFbUTSQFcR00ml6ZiVa1OmXZ4xk,19652
|
|
60
60
|
kagglesdk/education/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -67,23 +67,32 @@ kagglesdk/kernels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
|
|
|
67
67
|
kagglesdk/kernels/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
68
|
kagglesdk/kernels/services/kernels_api_service.py,sha256=uRsWb4FFmkPKiQGqajQSi6oRcCUkuM70xMEbWWffxpA,4402
|
|
69
69
|
kagglesdk/kernels/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
|
-
kagglesdk/kernels/types/kernels_api_service.py,sha256=
|
|
70
|
+
kagglesdk/kernels/types/kernels_api_service.py,sha256=WrA05JY1HHZjtFLoyoTx0d1tpacKBMEvZk9rqD6sKho,62183
|
|
71
71
|
kagglesdk/kernels/types/kernels_enums.py,sha256=lg1bQyVN2tZ7k9Hy5bY5vjm9GzAbzI0uW-W527BmzIA,597
|
|
72
72
|
kagglesdk/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
73
73
|
kagglesdk/models/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
|
-
kagglesdk/models/services/model_api_service.py,sha256=
|
|
74
|
+
kagglesdk/models/services/model_api_service.py,sha256=0z9ROm5Lf4N-lR28_NAnSgJaPM-f_wxlU7ltzo_WDJ0,10225
|
|
75
75
|
kagglesdk/models/services/model_service.py,sha256=-KM64rnYBO8L2ten5VEhQW7OhZa7yaIc4dOYROtJvYU,672
|
|
76
76
|
kagglesdk/models/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
77
|
-
kagglesdk/models/types/model_api_service.py,sha256=
|
|
77
|
+
kagglesdk/models/types/model_api_service.py,sha256=mBF8loxyi954Sj9DZr-1Voy5cuKTTFuyMrXRA2TfjWw,112144
|
|
78
78
|
kagglesdk/models/types/model_enums.py,sha256=pitgapPKLK4BUWFOMQaSDgyrsk6bYJ4nzZ3FJPZWJWA,2013
|
|
79
79
|
kagglesdk/models/types/model_service.py,sha256=cAJ3P_DInVWZ0Io46zi8SWnQtBJFIJkw6TW330gMVLA,7648
|
|
80
80
|
kagglesdk/models/types/model_types.py,sha256=jg2rDQP48OG0hikZC4NI6tlf4F00eUgRO2Br6c-QJUA,8048
|
|
81
|
-
kagglesdk/
|
|
81
|
+
kagglesdk/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
82
|
+
kagglesdk/security/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
83
|
+
kagglesdk/security/services/oauth_service.py,sha256=gtNnNP1IlKSK8c2zwxSZOC-WQHo5AsZlf-h7g8nqdgo,1177
|
|
84
|
+
kagglesdk/security/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
85
|
+
kagglesdk/security/types/authentication.py,sha256=NZZQEJ8ewQiJu-UkV3Z7oofKQAs0E1CoGUAzgRE7GSQ,4897
|
|
86
|
+
kagglesdk/security/types/oauth_service.py,sha256=1y2oz8TKeKIkR26_Izptsj27oqAa9vabwM6NOqTQM4E,12892
|
|
87
|
+
kagglesdk/test/test_client.py,sha256=C_cyzV_SaFVDthbBfzf5AqIyz9k3g2aOuo283904cck,1065
|
|
82
88
|
kagglesdk/users/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
89
|
+
kagglesdk/users/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
90
|
+
kagglesdk/users/services/account_service.py,sha256=pSsv_5a1VWJ9hBcpOohjQuqooL8086wtChMSFmo5RA8,712
|
|
83
91
|
kagglesdk/users/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
|
+
kagglesdk/users/types/account_service.py,sha256=As1aIBxCawzzc6Z1jYKkNStRtDZBwV20L2z0IZFIWUw,6890
|
|
84
93
|
kagglesdk/users/types/users_enums.py,sha256=iAzI5TAM8tysOcqG2AUsb-DTdWEQF9XPOCy-M8Vv_ro,380
|
|
85
|
-
kaggle-1.7.4.
|
|
86
|
-
kaggle-1.7.4.
|
|
87
|
-
kaggle-1.7.4.
|
|
88
|
-
kaggle-1.7.4.
|
|
89
|
-
kaggle-1.7.4.
|
|
94
|
+
kaggle-1.7.4.5.dist-info/METADATA,sha256=oh-FtAhsGjM14hzKXu8ieEqyjEj7FxCmLGjgIYlU_Ok,16953
|
|
95
|
+
kaggle-1.7.4.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
96
|
+
kaggle-1.7.4.5.dist-info/entry_points.txt,sha256=hl3dQAS4qpVkC5FWiqfnU6qKJU924OEN6PsHEiw-FGg,43
|
|
97
|
+
kaggle-1.7.4.5.dist-info/licenses/LICENSE.txt,sha256=IzhfWrxIlFAci3lzZCg5WWHZJBI1QSzsHxO0plI63vk,11541
|
|
98
|
+
kaggle-1.7.4.5.dist-info/RECORD,,
|
kagglesdk/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
from kagglesdk.kaggle_client import KaggleClient
|
|
2
|
-
from kagglesdk.kaggle_env import KaggleEnv
|
|
2
|
+
from kagglesdk.kaggle_env import KaggleEnv
|
|
@@ -1355,6 +1355,7 @@ class ApiDownloadDatasetRequest(KaggleObject):
|
|
|
1355
1355
|
file_name (str)
|
|
1356
1356
|
dataset_version_number (int)
|
|
1357
1357
|
raw (bool)
|
|
1358
|
+
hash_link (str)
|
|
1358
1359
|
"""
|
|
1359
1360
|
|
|
1360
1361
|
def __init__(self):
|
|
@@ -1363,6 +1364,7 @@ class ApiDownloadDatasetRequest(KaggleObject):
|
|
|
1363
1364
|
self._file_name = None
|
|
1364
1365
|
self._dataset_version_number = None
|
|
1365
1366
|
self._raw = False
|
|
1367
|
+
self._hash_link = None
|
|
1366
1368
|
self._freeze()
|
|
1367
1369
|
|
|
1368
1370
|
@property
|
|
@@ -1430,6 +1432,19 @@ class ApiDownloadDatasetRequest(KaggleObject):
|
|
|
1430
1432
|
raise TypeError('raw must be of type bool')
|
|
1431
1433
|
self._raw = raw
|
|
1432
1434
|
|
|
1435
|
+
@property
|
|
1436
|
+
def hash_link(self) -> str:
|
|
1437
|
+
return self._hash_link or ""
|
|
1438
|
+
|
|
1439
|
+
@hash_link.setter
|
|
1440
|
+
def hash_link(self, hash_link: str):
|
|
1441
|
+
if hash_link is None:
|
|
1442
|
+
del self.hash_link
|
|
1443
|
+
return
|
|
1444
|
+
if not isinstance(hash_link, str):
|
|
1445
|
+
raise TypeError('hash_link must be of type str')
|
|
1446
|
+
self._hash_link = hash_link
|
|
1447
|
+
|
|
1433
1448
|
def endpoint(self):
|
|
1434
1449
|
if self.file_name:
|
|
1435
1450
|
path = '/api/v1/datasets/download/{owner_slug}/{dataset_slug}/{file_name}'
|
|
@@ -2668,6 +2683,7 @@ ApiDownloadDatasetRequest._fields = [
|
|
|
2668
2683
|
FieldMetadata("fileName", "file_name", "_file_name", str, None, PredefinedSerializer(), optional=True),
|
|
2669
2684
|
FieldMetadata("datasetVersionNumber", "dataset_version_number", "_dataset_version_number", int, None, PredefinedSerializer(), optional=True),
|
|
2670
2685
|
FieldMetadata("raw", "raw", "_raw", bool, False, PredefinedSerializer()),
|
|
2686
|
+
FieldMetadata("hashLink", "hash_link", "_hash_link", str, None, PredefinedSerializer(), optional=True),
|
|
2671
2687
|
]
|
|
2672
2688
|
|
|
2673
2689
|
ApiGetDatasetMetadataRequest._fields = [
|
kagglesdk/kaggle_client.py
CHANGED
|
@@ -6,6 +6,8 @@ from kagglesdk.models.services.model_service import ModelClient
|
|
|
6
6
|
from kagglesdk.competitions.services.competition_api_service import CompetitionApiClient
|
|
7
7
|
from kagglesdk.datasets.services.dataset_api_service import DatasetApiClient
|
|
8
8
|
from kagglesdk.admin.services.inbox_file_service import InboxFileClient
|
|
9
|
+
from kagglesdk.security.services.oauth_service import OAuthClient
|
|
10
|
+
from kagglesdk.users.services.account_service import AccountClient
|
|
9
11
|
from kagglesdk.kaggle_env import KaggleEnv
|
|
10
12
|
from kagglesdk.kaggle_http_client import KaggleHttpClient
|
|
11
13
|
|
|
@@ -40,6 +42,14 @@ class KaggleClient(object):
|
|
|
40
42
|
def __init__(self, http_client: KaggleHttpClient):
|
|
41
43
|
self.inbox_file_client = InboxFileClient(http_client)
|
|
42
44
|
|
|
45
|
+
class Security(object):
|
|
46
|
+
def __init__(self, http_client: KaggleHttpClient):
|
|
47
|
+
self.oauth_client = OAuthClient(http_client)
|
|
48
|
+
|
|
49
|
+
class Users(object):
|
|
50
|
+
def __init__(self, http_client: KaggleHttpClient):
|
|
51
|
+
self.account_client = AccountClient(http_client)
|
|
52
|
+
|
|
43
53
|
def __init__(self, env: KaggleEnv = None, verbose: bool = False, username: str = None, password: str = None):
|
|
44
54
|
self._http_client = http_client = KaggleHttpClient(env, verbose, self._renew_iap_token, username=username, password=password)
|
|
45
55
|
self.kernels = KaggleClient.Kernels(http_client)
|
|
@@ -49,6 +59,8 @@ class KaggleClient(object):
|
|
|
49
59
|
self.competitions = KaggleClient.Competitions(http_client)
|
|
50
60
|
self.datasets = KaggleClient.Datasets(http_client)
|
|
51
61
|
self.admin = KaggleClient.Admin(http_client)
|
|
62
|
+
self.security = KaggleClient.Security(http_client)
|
|
63
|
+
self.users = KaggleClient.Users(http_client)
|
|
52
64
|
self.username = username
|
|
53
65
|
self.password = password
|
|
54
66
|
|
kagglesdk/kaggle_env.py
CHANGED
|
@@ -6,18 +6,18 @@ class KaggleEnv(Enum):
|
|
|
6
6
|
LOCAL = 0 # localhost
|
|
7
7
|
STAGING = 1 # staging.kaggle.com
|
|
8
8
|
ADMIN = 2 # admin.kaggle.com
|
|
9
|
-
QA = 3
|
|
9
|
+
QA = 3 # qa.kaggle.com
|
|
10
10
|
# Direct prod access is not allowed to have IAP protection during testing, but we support basic auth.
|
|
11
11
|
PROD = 4 # www.kaggle.com
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
_env_to_endpoint = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
KaggleEnv.LOCAL: 'http://localhost',
|
|
16
|
+
KaggleEnv.STAGING: 'https://staging.kaggle.com',
|
|
17
|
+
KaggleEnv.ADMIN: 'https://admin.kaggle.com',
|
|
18
|
+
KaggleEnv.QA: 'https://qa.kaggle.com',
|
|
19
|
+
# See the comment above in KaggleEnv enum.
|
|
20
|
+
KaggleEnv.PROD: 'https://www.kaggle.com',
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
|
|
@@ -27,8 +27,8 @@ def get_endpoint(env: KaggleEnv):
|
|
|
27
27
|
|
|
28
28
|
def get_env():
|
|
29
29
|
env = os.getenv('KAGGLE_API_ENVIRONMENT')
|
|
30
|
-
if env is None:
|
|
31
|
-
|
|
30
|
+
if env is None or env == 'PROD':
|
|
31
|
+
return KaggleEnv.PROD
|
|
32
32
|
if env == 'LOCALHOST':
|
|
33
33
|
return KaggleEnv.LOCAL
|
|
34
34
|
if env == 'ADMIN':
|
|
@@ -37,6 +37,4 @@ def get_env():
|
|
|
37
37
|
return KaggleEnv.STAGING
|
|
38
38
|
if env == 'QA':
|
|
39
39
|
return KaggleEnv.QA
|
|
40
|
-
if env == 'PROD':
|
|
41
|
-
return KaggleEnv.PROD
|
|
42
40
|
raise Exception(f'Unrecognized value in KAGGLE_API_ENVIRONMENT: "{env}"')
|
kagglesdk/kaggle_http_client.py
CHANGED
|
@@ -18,7 +18,14 @@ from typing import Type
|
|
|
18
18
|
# currently usable by the CLI.
|
|
19
19
|
|
|
20
20
|
# TODO: Extend kapigen to add a boolean to these requests indicating that they use forms.
|
|
21
|
-
REQUESTS_REQUIRING_FORMS = [
|
|
21
|
+
REQUESTS_REQUIRING_FORMS = [
|
|
22
|
+
'ApiUploadDatasetFileRequest',
|
|
23
|
+
'ApiCreateSubmissionRequest',
|
|
24
|
+
'ApiCreateCodeSubmissionRequest',
|
|
25
|
+
'ApiStartSubmissionUploadRequest',
|
|
26
|
+
'ApiUploadModelFileRequest',
|
|
27
|
+
]
|
|
28
|
+
|
|
22
29
|
|
|
23
30
|
def _headers_to_str(headers):
|
|
24
31
|
return '\n'.join(f'{k}: {v}' for k, v in headers.items())
|
|
@@ -44,7 +51,9 @@ def _get_apikey_creds():
|
|
|
44
51
|
|
|
45
52
|
def clean_data(data):
|
|
46
53
|
if isinstance(data, dict):
|
|
47
|
-
return {
|
|
54
|
+
return {
|
|
55
|
+
to_lower_camel_case(k): clean_data(v) for k, v in data.items() if v is not None
|
|
56
|
+
}
|
|
48
57
|
if isinstance(data, list):
|
|
49
58
|
return [clean_data(v) for v in data if v is not None]
|
|
50
59
|
if data is True:
|
|
@@ -53,6 +62,7 @@ def clean_data(data):
|
|
|
53
62
|
return 'false'
|
|
54
63
|
return data
|
|
55
64
|
|
|
65
|
+
|
|
56
66
|
def find_words(source, left='{', right='}'):
|
|
57
67
|
words = []
|
|
58
68
|
split_str = source.split(left)
|
|
@@ -64,8 +74,10 @@ def find_words(source, left='{', right='}'):
|
|
|
64
74
|
|
|
65
75
|
return words
|
|
66
76
|
|
|
77
|
+
|
|
67
78
|
def to_camel_case(snake_str):
|
|
68
|
-
return
|
|
79
|
+
return ''.join(x.capitalize() for x in snake_str.lower().split('_'))
|
|
80
|
+
|
|
69
81
|
|
|
70
82
|
def to_lower_camel_case(snake_str):
|
|
71
83
|
# https://stackoverflow.com/questions/19053707/converting-snake-case-to-lower-camel-case-lowercamelcase
|
|
@@ -74,18 +86,21 @@ def to_lower_camel_case(snake_str):
|
|
|
74
86
|
camel_string = to_camel_case(snake_str)
|
|
75
87
|
return snake_str[0].lower() + camel_string[1:]
|
|
76
88
|
|
|
89
|
+
|
|
77
90
|
class KaggleHttpClient(object):
|
|
78
91
|
_xsrf_cookie_name = 'XSRF-TOKEN'
|
|
79
|
-
_csrf_cookie_name =
|
|
92
|
+
_csrf_cookie_name = 'CSRF-TOKEN'
|
|
80
93
|
_xsrf_cookies = (_xsrf_cookie_name, _csrf_cookie_name)
|
|
81
94
|
_xsrf_header_name = 'X-XSRF-TOKEN'
|
|
82
95
|
|
|
83
|
-
def __init__(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
96
|
+
def __init__(
|
|
97
|
+
self,
|
|
98
|
+
env: KaggleEnv = None,
|
|
99
|
+
verbose: bool = False,
|
|
100
|
+
renew_iap_token=None,
|
|
101
|
+
username=None,
|
|
102
|
+
password=None,
|
|
103
|
+
):
|
|
89
104
|
self._env = env or get_env()
|
|
90
105
|
self._signed_in = None
|
|
91
106
|
self._endpoint = get_endpoint(self._env)
|
|
@@ -94,21 +109,29 @@ class KaggleHttpClient(object):
|
|
|
94
109
|
self._username = username
|
|
95
110
|
self._password = password
|
|
96
111
|
|
|
97
|
-
def call(
|
|
98
|
-
|
|
112
|
+
def call(
|
|
113
|
+
self,
|
|
114
|
+
service_name: str,
|
|
115
|
+
request_name: str,
|
|
116
|
+
request: KaggleObject,
|
|
117
|
+
response_type: Type[KaggleObject],
|
|
118
|
+
):
|
|
99
119
|
self._init_session()
|
|
100
120
|
http_request = self._prepare_request(service_name, request_name, request)
|
|
101
121
|
|
|
102
|
-
|
|
122
|
+
# Merge environment settings into session
|
|
123
|
+
settings = self._session.merge_environment_settings(http_request.url, {}, None, None, None)
|
|
124
|
+
http_response = self._session.send(http_request, **settings)
|
|
103
125
|
|
|
104
126
|
response = self._prepare_response(response_type, http_response)
|
|
105
127
|
return response
|
|
106
128
|
|
|
107
|
-
def _prepare_request(
|
|
108
|
-
|
|
129
|
+
def _prepare_request(
|
|
130
|
+
self, service_name: str, request_name: str, request: KaggleObject
|
|
131
|
+
):
|
|
109
132
|
request_url = self._get_request_url(request)
|
|
110
133
|
method = request.method()
|
|
111
|
-
data= ''
|
|
134
|
+
data = ''
|
|
112
135
|
if method == 'GET':
|
|
113
136
|
data = request.__class__.to_dict(request, ignore_defaults=False)
|
|
114
137
|
if request.endpoint_path():
|
|
@@ -119,10 +142,12 @@ class KaggleHttpClient(object):
|
|
|
119
142
|
if data:
|
|
120
143
|
request_url = f'{request_url}?{urllib.parse.urlencode(clean_data(data))}'
|
|
121
144
|
data = ''
|
|
122
|
-
self._session.headers.update(
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
145
|
+
self._session.headers.update(
|
|
146
|
+
{
|
|
147
|
+
'Accept': 'application/json',
|
|
148
|
+
'Content-Type': 'text/plain',
|
|
149
|
+
}
|
|
150
|
+
)
|
|
126
151
|
elif method == 'POST':
|
|
127
152
|
data = request.to_field_map(request, ignore_defaults=True)
|
|
128
153
|
if isinstance(data, dict):
|
|
@@ -136,17 +161,20 @@ class KaggleHttpClient(object):
|
|
|
136
161
|
else:
|
|
137
162
|
content_type = 'application/json'
|
|
138
163
|
data = json.dumps(data)
|
|
139
|
-
self._session.headers.update(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
164
|
+
self._session.headers.update(
|
|
165
|
+
{
|
|
166
|
+
'Accept': 'application/json',
|
|
167
|
+
'Content-Type': content_type,
|
|
168
|
+
}
|
|
169
|
+
)
|
|
143
170
|
http_request = requests.Request(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
171
|
+
method=method,
|
|
172
|
+
url=request_url,
|
|
173
|
+
data=data,
|
|
174
|
+
headers=self._session.headers,
|
|
175
|
+
# cookies=self._get_xsrf_cookies(),
|
|
176
|
+
auth=self._session.auth,
|
|
177
|
+
)
|
|
150
178
|
prepared_request = http_request.prepare()
|
|
151
179
|
self._print_request(prepared_request)
|
|
152
180
|
return prepared_request
|
|
@@ -164,8 +192,7 @@ class KaggleHttpClient(object):
|
|
|
164
192
|
if 'application/json' in http_response.headers['Content-Type']:
|
|
165
193
|
resp = http_response.json()
|
|
166
194
|
if 'code' in resp and resp['code'] >= 400:
|
|
167
|
-
raise requests.exceptions.HTTPError(
|
|
168
|
-
resp['message'], response=http_response)
|
|
195
|
+
raise requests.exceptions.HTTPError(resp['message'], response=http_response)
|
|
169
196
|
if response_type is None: # Method doesn't have a return type
|
|
170
197
|
return None
|
|
171
198
|
return response_type.prepare_from(http_response)
|
|
@@ -175,8 +202,8 @@ class KaggleHttpClient(object):
|
|
|
175
202
|
return
|
|
176
203
|
self._print('---------------------Request----------------------')
|
|
177
204
|
self._print(
|
|
178
|
-
|
|
179
|
-
|
|
205
|
+
f'{request.method} {request.url}\n{_headers_to_str(request.headers)}\n\n{request.body}'
|
|
206
|
+
)
|
|
180
207
|
self._print('--------------------------------------------------')
|
|
181
208
|
|
|
182
209
|
def _print_response(self, response, body=True):
|
|
@@ -205,17 +232,21 @@ class KaggleHttpClient(object):
|
|
|
205
232
|
return self._session
|
|
206
233
|
|
|
207
234
|
self._session = requests.Session()
|
|
208
|
-
self._session.headers.update(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
235
|
+
self._session.headers.update(
|
|
236
|
+
{
|
|
237
|
+
'User-Agent': 'kaggle-api/v1.7.0', # Was: V2
|
|
238
|
+
'Content-Type': 'application/x-www-form-urlencoded', # Was: /json
|
|
239
|
+
}
|
|
240
|
+
)
|
|
212
241
|
|
|
213
242
|
iap_token = self._get_iap_token_if_required()
|
|
214
243
|
if iap_token is not None:
|
|
215
|
-
self._session.headers.update(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
244
|
+
self._session.headers.update(
|
|
245
|
+
{
|
|
246
|
+
# https://cloud.google.com/iap/docs/authentication-howto#authenticating_from_proxy-authorization_header
|
|
247
|
+
'Proxy-Authorization': f'Bearer {iap_token}',
|
|
248
|
+
}
|
|
249
|
+
)
|
|
219
250
|
|
|
220
251
|
self._try_fill_auth()
|
|
221
252
|
# self._fill_xsrf_token(iap_token) # TODO Make this align with original handler.
|
|
@@ -230,10 +261,11 @@ class KaggleHttpClient(object):
|
|
|
230
261
|
|
|
231
262
|
def _fill_xsrf_token(self, iap_token):
|
|
232
263
|
initial_get_request = requests.Request(
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
264
|
+
method='GET',
|
|
265
|
+
url=self._endpoint,
|
|
266
|
+
headers=self._session.headers,
|
|
267
|
+
auth=self._session.auth,
|
|
268
|
+
)
|
|
237
269
|
prepared_request = initial_get_request.prepare()
|
|
238
270
|
self._print_request(prepared_request)
|
|
239
271
|
|
|
@@ -244,10 +276,13 @@ class KaggleHttpClient(object):
|
|
|
244
276
|
raise requests.exceptions.HTTPError('IAP token invalid or expired')
|
|
245
277
|
http_response.raise_for_status()
|
|
246
278
|
|
|
247
|
-
self._session.headers.update(
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
279
|
+
self._session.headers.update(
|
|
280
|
+
{
|
|
281
|
+
KaggleHttpClient._xsrf_header_name: self._session.cookies[
|
|
282
|
+
KaggleHttpClient._xsrf_cookie_name
|
|
283
|
+
],
|
|
284
|
+
}
|
|
285
|
+
)
|
|
251
286
|
|
|
252
287
|
class BearerAuth(requests.auth.AuthBase):
|
|
253
288
|
|
|
@@ -255,7 +290,7 @@ class KaggleHttpClient(object):
|
|
|
255
290
|
self.token = token
|
|
256
291
|
|
|
257
292
|
def __call__(self, r):
|
|
258
|
-
r.headers[
|
|
293
|
+
r.headers['Authorization'] = f'Bearer {self.token}'
|
|
259
294
|
return r
|
|
260
295
|
|
|
261
296
|
def _try_fill_auth(self):
|
|
@@ -286,11 +321,11 @@ class KaggleHttpClient(object):
|
|
|
286
321
|
def make_form(fields):
|
|
287
322
|
body = BytesIO()
|
|
288
323
|
boundary = binascii.hexlify(os.urandom(16)).decode()
|
|
289
|
-
writer = codecs.lookup(
|
|
324
|
+
writer = codecs.lookup('utf-8')[3]
|
|
290
325
|
|
|
291
326
|
for field in fields.items():
|
|
292
327
|
field = RequestField.from_tuples(*field)
|
|
293
|
-
body.write(f
|
|
328
|
+
body.write(f'--{boundary}\r\n'.encode('latin-1'))
|
|
294
329
|
|
|
295
330
|
writer(body).write(field.render_headers())
|
|
296
331
|
data = field.data
|
|
@@ -303,11 +338,11 @@ class KaggleHttpClient(object):
|
|
|
303
338
|
else:
|
|
304
339
|
body.write(data)
|
|
305
340
|
|
|
306
|
-
body.write(b
|
|
341
|
+
body.write(b'\r\n')
|
|
307
342
|
|
|
308
|
-
body.write(f
|
|
343
|
+
body.write(f'--{boundary}--\r\n'.encode('latin-1'))
|
|
309
344
|
|
|
310
|
-
content_type = f
|
|
345
|
+
content_type = f'multipart/form-data; boundary={boundary}'
|
|
311
346
|
|
|
312
347
|
return body.getvalue(), content_type
|
|
313
348
|
|