kaggle 1.7.4.2__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 +907 -876
- 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.2.dist-info → kaggle-1.7.4.5.dist-info}/METADATA +1 -1
- {kaggle-1.7.4.2.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.2.dist-info → kaggle-1.7.4.5.dist-info}/WHEEL +0 -0
- {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/entry_points.txt +0 -0
- {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/licenses/LICENSE.txt +0 -0
kagglesdk/kaggle_object.py
CHANGED
|
@@ -5,31 +5,36 @@ from google.protobuf.field_mask_pb2 import FieldMask
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class ObjectSerializer(object):
|
|
8
|
+
|
|
8
9
|
def __init__(self, to_dict_value, from_dict_value):
|
|
9
10
|
self.to_dict_value = to_dict_value
|
|
10
11
|
self.from_dict_value = from_dict_value
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class PredefinedSerializer(ObjectSerializer):
|
|
15
|
+
|
|
14
16
|
def __init__(self):
|
|
15
17
|
"""Predefined objects such as int, float etc are serialized/deserialized directly."""
|
|
16
18
|
ObjectSerializer.__init__(self, lambda cls, v, _: v, lambda cls, v: v)
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
# Adapted from https://stackoverflow.com/questions/1175208/elegant-python-function-to-convert-camelcase-to-snake-case
|
|
20
|
-
_pascal_to_upper_snake_case_regex = re.compile(
|
|
22
|
+
_pascal_to_upper_snake_case_regex = re.compile(
|
|
23
|
+
'((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))'
|
|
24
|
+
)
|
|
21
25
|
|
|
22
26
|
|
|
23
27
|
def _pascal_case_to_upper_snake_case(string):
|
|
24
28
|
return _pascal_to_upper_snake_case_regex.sub(r'_\1', string).upper()
|
|
25
29
|
|
|
26
30
|
|
|
27
|
-
def _convert
|
|
31
|
+
def _convert(camel_input):
|
|
28
32
|
words = re.findall(r'[A-Z]?[a-z]+|[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)|\d+', camel_input)
|
|
29
33
|
return '_'.join(map(str.lower, words))
|
|
30
34
|
|
|
31
35
|
|
|
32
36
|
class EnumSerializer(ObjectSerializer):
|
|
37
|
+
|
|
33
38
|
def __init__(self):
|
|
34
39
|
"""
|
|
35
40
|
Enum objects are serialized using their ".name" field and deserialized by indexing the string in the Enum type.
|
|
@@ -40,21 +45,23 @@ class EnumSerializer(ObjectSerializer):
|
|
|
40
45
|
foo.name # => returns "TEST"
|
|
41
46
|
Foo["TEST"] # => returns Foo.TEST enum value.
|
|
42
47
|
"""
|
|
43
|
-
ObjectSerializer.__init__(
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
ObjectSerializer.__init__(
|
|
49
|
+
self,
|
|
50
|
+
lambda cls, v, _: EnumSerializer._to_str(cls, v),
|
|
51
|
+
lambda cls, v: EnumSerializer._from_str(cls, v),
|
|
52
|
+
)
|
|
46
53
|
|
|
47
54
|
@staticmethod
|
|
48
55
|
def _to_str(cls, v):
|
|
49
56
|
# "v" corresponds to an enum instance: Example foo or Foo.Test above.
|
|
50
57
|
# "cls" corresponds to the enum type Foo above.
|
|
51
|
-
#enum_prefix = f'{_pascal_case_to_upper_snake_case(cls.__name__)}_'
|
|
52
|
-
#if v.name.startswith(enum_prefix):
|
|
58
|
+
# enum_prefix = f'{_pascal_case_to_upper_snake_case(cls.__name__)}_'
|
|
59
|
+
# if v.name.startswith(enum_prefix):
|
|
53
60
|
# return v.name
|
|
54
|
-
#return f'{enum_prefix}{v.name}'
|
|
61
|
+
# return f'{enum_prefix}{v.name}'
|
|
55
62
|
enum_prefix = f'{_pascal_case_to_upper_snake_case(cls.__name__)}_'
|
|
56
63
|
if v.name.find(enum_prefix) == 0:
|
|
57
|
-
return v.name[len(enum_prefix):].lower()
|
|
64
|
+
return v.name[len(enum_prefix) :].lower()
|
|
58
65
|
return v.name
|
|
59
66
|
|
|
60
67
|
@staticmethod
|
|
@@ -64,13 +71,13 @@ class EnumSerializer(ObjectSerializer):
|
|
|
64
71
|
# enum_items = {item.name: item for item in cls}
|
|
65
72
|
# if v in enum_items:
|
|
66
73
|
# return enum_items[v]
|
|
67
|
-
#
|
|
74
|
+
#
|
|
68
75
|
# # Try with enum prefix. Example: EnvironmentType.JSON -> "ENVIRONMENT_TYPE_JSON"
|
|
69
76
|
# enum_prefix = _pascal_case_to_upper_snake_case(cls.__name__)
|
|
70
77
|
# if v.startswith(enum_prefix):
|
|
71
78
|
# ix_start = len(enum_prefix) + 1
|
|
72
79
|
# return enum_items[v[ix_start:]]
|
|
73
|
-
#
|
|
80
|
+
#
|
|
74
81
|
# return enum_items[f'{enum_prefix}_{v}']
|
|
75
82
|
try:
|
|
76
83
|
return cls[v]
|
|
@@ -89,33 +96,49 @@ class EnumSerializer(ObjectSerializer):
|
|
|
89
96
|
|
|
90
97
|
|
|
91
98
|
class ListSerializer(ObjectSerializer):
|
|
99
|
+
|
|
92
100
|
def __init__(self, item_serializer: ObjectSerializer):
|
|
93
101
|
"""
|
|
94
102
|
Lists are serialized based on the type they contain. Since objects are generated from proto files, a list always
|
|
95
103
|
contains objects of the same type, which is serialized/deserialized using "item_serializer".
|
|
96
104
|
"""
|
|
97
|
-
ObjectSerializer.__init__(
|
|
98
|
-
|
|
99
|
-
|
|
105
|
+
ObjectSerializer.__init__(
|
|
106
|
+
self,
|
|
107
|
+
lambda cls, l, ignore_defaults: [
|
|
108
|
+
item_serializer.to_dict_value(cls, v, ignore_defaults) for v in l
|
|
109
|
+
],
|
|
110
|
+
lambda cls, l: [item_serializer.from_dict_value(cls, v) for v in l],
|
|
111
|
+
)
|
|
100
112
|
|
|
101
113
|
|
|
102
114
|
class MapSerializer(ObjectSerializer):
|
|
115
|
+
|
|
103
116
|
def __init__(self, item_serializer: ObjectSerializer):
|
|
104
117
|
"""
|
|
105
118
|
Maps are serialized based on type of their values. Since maps keys are always predefined types, we don't need a
|
|
106
119
|
serializer for them.
|
|
107
120
|
"""
|
|
108
|
-
ObjectSerializer.__init__(
|
|
109
|
-
|
|
110
|
-
|
|
121
|
+
ObjectSerializer.__init__(
|
|
122
|
+
self,
|
|
123
|
+
lambda cls, d, ignore_defaults: {
|
|
124
|
+
k: item_serializer.to_dict_value(cls, v, ignore_defaults)
|
|
125
|
+
for k, v in d.items()
|
|
126
|
+
},
|
|
127
|
+
lambda cls, d: {
|
|
128
|
+
k: item_serializer.from_dict_value(cls, v) for k, v in d.items()
|
|
129
|
+
},
|
|
130
|
+
)
|
|
111
131
|
|
|
112
132
|
|
|
113
133
|
class DateTimeSerializer(ObjectSerializer):
|
|
134
|
+
|
|
114
135
|
def __init__(self):
|
|
115
136
|
"""Date times are serialized/deserialized as a string in iso format"""
|
|
116
|
-
ObjectSerializer.__init__(
|
|
117
|
-
|
|
118
|
-
|
|
137
|
+
ObjectSerializer.__init__(
|
|
138
|
+
self,
|
|
139
|
+
lambda cls, dt, _: DateTimeSerializer._to_str(dt),
|
|
140
|
+
lambda _, v: DateTimeSerializer._from_str(v),
|
|
141
|
+
)
|
|
119
142
|
|
|
120
143
|
@staticmethod
|
|
121
144
|
def _to_str(dt):
|
|
@@ -132,15 +155,18 @@ class DateTimeSerializer(ObjectSerializer):
|
|
|
132
155
|
try:
|
|
133
156
|
return datetime.fromisoformat(f'{dt}.{millis}')
|
|
134
157
|
except ValueError:
|
|
135
|
-
return datetime.fromisoformat(dt)
|
|
158
|
+
return datetime.fromisoformat(dt) # Python 3.9, 3.10
|
|
136
159
|
|
|
137
160
|
|
|
138
161
|
class TimeDeltaSerializer(ObjectSerializer):
|
|
162
|
+
|
|
139
163
|
def __init__(self):
|
|
140
164
|
"""Time deltas are serialized/deserialized as a string in "mm:ss" format"""
|
|
141
|
-
ObjectSerializer.__init__(
|
|
142
|
-
|
|
143
|
-
|
|
165
|
+
ObjectSerializer.__init__(
|
|
166
|
+
self,
|
|
167
|
+
lambda cls, t, _: TimeDeltaSerializer._to_dict_value(t),
|
|
168
|
+
lambda cls, v: TimeDeltaSerializer._from_dict_value(v),
|
|
169
|
+
)
|
|
144
170
|
|
|
145
171
|
@staticmethod
|
|
146
172
|
def _to_dict_value(delta):
|
|
@@ -156,11 +182,14 @@ class TimeDeltaSerializer(ObjectSerializer):
|
|
|
156
182
|
|
|
157
183
|
|
|
158
184
|
class FieldMaskSerializer(ObjectSerializer):
|
|
185
|
+
|
|
159
186
|
def __init__(self):
|
|
160
187
|
"""Field masks are serialized/deserialized as a string that contains a list of paths with a comma delimiter"""
|
|
161
|
-
ObjectSerializer.__init__(
|
|
162
|
-
|
|
163
|
-
|
|
188
|
+
ObjectSerializer.__init__(
|
|
189
|
+
self,
|
|
190
|
+
lambda cls, m, _: m.ToJsonString(),
|
|
191
|
+
lambda cls, v: FieldMaskSerializer._from_joined_paths(v),
|
|
192
|
+
)
|
|
164
193
|
|
|
165
194
|
@staticmethod
|
|
166
195
|
def _from_joined_paths(joined_paths):
|
|
@@ -170,24 +199,37 @@ class FieldMaskSerializer(ObjectSerializer):
|
|
|
170
199
|
|
|
171
200
|
|
|
172
201
|
class KaggleObjectSerializer(ObjectSerializer):
|
|
202
|
+
|
|
173
203
|
def __init__(self):
|
|
174
204
|
"""
|
|
175
205
|
Kaggle objects (i.e., proto-generated types that inherit from KaggleObject) have custom "to_dict" and "from_dict"
|
|
176
206
|
methods that serialize/deserialize them to/from dictionaries.
|
|
177
207
|
"""
|
|
178
|
-
ObjectSerializer.__init__(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
208
|
+
ObjectSerializer.__init__(
|
|
209
|
+
self,
|
|
210
|
+
# "v" is an instance of a KaggleObject. For example: "req = ListCompetitionsRequest()".
|
|
211
|
+
# So "req.to_dict()" returns a dictionary with keys as json field names. Example:
|
|
212
|
+
# '{"pageSize": 10, "page": 2}'
|
|
213
|
+
lambda cls, v, ignore_defaults: cls.to_dict(v, ignore_defaults),
|
|
214
|
+
# "cls" is the type of a KaggleObject. For example: ListCompetitionsRequest. All
|
|
215
|
+
# generated Kaggle objects have "from_dict" class method that takes a dict to create a
|
|
216
|
+
# new instance of the object. See "KaggleObject" class definition below.
|
|
217
|
+
lambda cls, v: cls.from_dict(v),
|
|
218
|
+
)
|
|
187
219
|
|
|
188
220
|
|
|
189
221
|
class FieldMetadata(object):
|
|
190
|
-
|
|
222
|
+
|
|
223
|
+
def __init__(
|
|
224
|
+
self,
|
|
225
|
+
json_name,
|
|
226
|
+
field_name,
|
|
227
|
+
private_field_name,
|
|
228
|
+
field_type,
|
|
229
|
+
default_value,
|
|
230
|
+
serializer,
|
|
231
|
+
optional=False,
|
|
232
|
+
):
|
|
191
233
|
self.json_name = json_name
|
|
192
234
|
self.field_name = field_name
|
|
193
235
|
self.private_field_name = private_field_name
|
|
@@ -211,12 +253,17 @@ class FieldMetadata(object):
|
|
|
211
253
|
if value == self.default_value:
|
|
212
254
|
return # Ignore default values
|
|
213
255
|
try:
|
|
214
|
-
setattr(
|
|
256
|
+
setattr(
|
|
257
|
+
instance,
|
|
258
|
+
self.private_field_name,
|
|
259
|
+
self.serializer.from_dict_value(self.field_type, value),
|
|
260
|
+
)
|
|
215
261
|
except Exception as e:
|
|
216
262
|
raise
|
|
217
263
|
|
|
218
264
|
|
|
219
265
|
class KaggleObject(object):
|
|
266
|
+
|
|
220
267
|
def endpoint(self):
|
|
221
268
|
raise 'Error: endpoint must be defined by the request object'
|
|
222
269
|
|
|
@@ -234,7 +281,7 @@ class KaggleObject(object):
|
|
|
234
281
|
|
|
235
282
|
@staticmethod
|
|
236
283
|
def method():
|
|
237
|
-
return
|
|
284
|
+
return 'GET'
|
|
238
285
|
|
|
239
286
|
def _freeze(self):
|
|
240
287
|
self._is_frozen = True
|
|
@@ -245,12 +292,18 @@ class KaggleObject(object):
|
|
|
245
292
|
object.__setattr__(self, key, value)
|
|
246
293
|
|
|
247
294
|
def to_dict(self, ignore_defaults=True):
|
|
248
|
-
kv_pairs = [
|
|
295
|
+
kv_pairs = [
|
|
296
|
+
(field.json_name, field.get_as_dict_item(self, ignore_defaults))
|
|
297
|
+
for field in self._fields
|
|
298
|
+
]
|
|
249
299
|
return {k: v for (k, v) in kv_pairs if not ignore_defaults or v is not None}
|
|
250
300
|
|
|
251
301
|
@staticmethod
|
|
252
302
|
def to_field_map(self, ignore_defaults=True):
|
|
253
|
-
kv_pairs = [
|
|
303
|
+
kv_pairs = [
|
|
304
|
+
(field.field_name, field.get_as_dict_item(self, ignore_defaults))
|
|
305
|
+
for field in self._fields
|
|
306
|
+
]
|
|
254
307
|
return {k: v for (k, v) in kv_pairs if not ignore_defaults or v is not None}
|
|
255
308
|
|
|
256
309
|
@classmethod
|
|
@@ -292,5 +345,7 @@ class KaggleObject(object):
|
|
|
292
345
|
def _get_field(self, field_name):
|
|
293
346
|
field = next((f for f in self._fields if f.field_name == field_name), None)
|
|
294
347
|
if field is None:
|
|
295
|
-
raise ValueError(
|
|
348
|
+
raise ValueError(
|
|
349
|
+
f'Protocol message {self.__class__.__name__} has no "{field_name}" field.'
|
|
350
|
+
)
|
|
296
351
|
return field
|
|
@@ -1219,6 +1219,10 @@ class ApiSaveKernelRequest(KaggleObject):
|
|
|
1219
1219
|
session_timeout_seconds (int)
|
|
1220
1220
|
If specified, terminate the kernel session after this many seconds of
|
|
1221
1221
|
runtime, which must be lower than the global maximum.
|
|
1222
|
+
priority (int)
|
|
1223
|
+
Sets the execution priority of this kernel session request when queued,
|
|
1224
|
+
lower is better (10 will get run before 100).
|
|
1225
|
+
Only allowed or certain clients.
|
|
1222
1226
|
"""
|
|
1223
1227
|
|
|
1224
1228
|
def __init__(self):
|
|
@@ -1239,6 +1243,7 @@ class ApiSaveKernelRequest(KaggleObject):
|
|
|
1239
1243
|
self._docker_image_pinning_type = None
|
|
1240
1244
|
self._model_data_sources = []
|
|
1241
1245
|
self._session_timeout_seconds = None
|
|
1246
|
+
self._priority = None
|
|
1242
1247
|
self._freeze()
|
|
1243
1248
|
|
|
1244
1249
|
@property
|
|
@@ -1517,6 +1522,24 @@ class ApiSaveKernelRequest(KaggleObject):
|
|
|
1517
1522
|
raise TypeError('session_timeout_seconds must be of type int')
|
|
1518
1523
|
self._session_timeout_seconds = session_timeout_seconds
|
|
1519
1524
|
|
|
1525
|
+
@property
|
|
1526
|
+
def priority(self) -> int:
|
|
1527
|
+
r"""
|
|
1528
|
+
Sets the execution priority of this kernel session request when queued,
|
|
1529
|
+
lower is better (10 will get run before 100).
|
|
1530
|
+
Only allowed or certain clients.
|
|
1531
|
+
"""
|
|
1532
|
+
return self._priority or 0
|
|
1533
|
+
|
|
1534
|
+
@priority.setter
|
|
1535
|
+
def priority(self, priority: int):
|
|
1536
|
+
if priority is None:
|
|
1537
|
+
del self.priority
|
|
1538
|
+
return
|
|
1539
|
+
if not isinstance(priority, int):
|
|
1540
|
+
raise TypeError('priority must be of type int')
|
|
1541
|
+
self._priority = priority
|
|
1542
|
+
|
|
1520
1543
|
def endpoint(self):
|
|
1521
1544
|
path = '/api/v1/kernels/push'
|
|
1522
1545
|
return path.format_map(self.to_field_map(self))
|
|
@@ -1924,6 +1947,7 @@ ApiSaveKernelRequest._fields = [
|
|
|
1924
1947
|
FieldMetadata("dockerImagePinningType", "docker_image_pinning_type", "_docker_image_pinning_type", str, None, PredefinedSerializer(), optional=True),
|
|
1925
1948
|
FieldMetadata("modelDataSources", "model_data_sources", "_model_data_sources", str, [], ListSerializer(PredefinedSerializer())),
|
|
1926
1949
|
FieldMetadata("sessionTimeoutSeconds", "session_timeout_seconds", "_session_timeout_seconds", int, None, PredefinedSerializer(), optional=True),
|
|
1950
|
+
FieldMetadata("priority", "priority", "_priority", int, None, PredefinedSerializer(), optional=True),
|
|
1927
1951
|
]
|
|
1928
1952
|
|
|
1929
1953
|
ApiSaveKernelResponse._fields = [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from kagglesdk.common.types.http_redirect import HttpRedirect
|
|
2
2
|
from kagglesdk.kaggle_http_client import KaggleHttpClient
|
|
3
|
-
from kagglesdk.models.types.model_api_service import ApiCreateModelInstanceRequest, ApiCreateModelInstanceVersionRequest, ApiCreateModelRequest, ApiCreateModelResponse, ApiDeleteModelInstanceRequest, ApiDeleteModelInstanceVersionRequest, ApiDeleteModelRequest, ApiDeleteModelResponse, ApiDownloadModelInstanceVersionRequest, ApiGetModelInstanceRequest, ApiGetModelRequest, ApiListModelGatingUserConsentsRequest, ApiListModelGatingUserConsentsResponse, ApiListModelInstanceVersionFilesRequest, ApiListModelInstanceVersionFilesResponse, ApiListModelsRequest, ApiListModelsResponse, ApiModel, ApiModelInstance,
|
|
3
|
+
from kagglesdk.models.types.model_api_service import ApiCreateModelInstanceRequest, ApiCreateModelInstanceVersionRequest, ApiCreateModelRequest, ApiCreateModelResponse, ApiDeleteModelInstanceRequest, ApiDeleteModelInstanceVersionRequest, ApiDeleteModelRequest, ApiDeleteModelResponse, ApiDownloadModelInstanceVersionRequest, ApiGetModelInstanceRequest, ApiGetModelRequest, ApiListModelGatingUserConsentsRequest, ApiListModelGatingUserConsentsResponse, ApiListModelInstanceVersionFilesRequest, ApiListModelInstanceVersionFilesResponse, ApiListModelsRequest, ApiListModelsResponse, ApiModel, ApiModelInstance, ApiReviewModelGatingUserConsentRequest, ApiUpdateModelInstanceRequest, ApiUpdateModelRequest, ApiUpdateModelResponse, ApiUploadModelFileRequest, ApiUploadModelFileResponse, CreateModelSigningTokenRequest, CreateModelSigningTokenResponse, KeysRequest, KeysResponse, WellKnowEndpointRequest, WellKnowEndpointResponse
|
|
4
4
|
|
|
5
5
|
class ModelApiClient(object):
|
|
6
6
|
|
|
@@ -240,16 +240,17 @@ class ModelApiClient(object):
|
|
|
240
240
|
|
|
241
241
|
return self._client.call("models.ModelApiService", "ApiListModelGatingUserConsents", request, ApiListModelGatingUserConsentsResponse)
|
|
242
242
|
|
|
243
|
-
def
|
|
243
|
+
def review_model_gating_user_consent(self, request: ApiReviewModelGatingUserConsentRequest = None):
|
|
244
244
|
r"""
|
|
245
|
-
Review the user consents for
|
|
245
|
+
Review the user consents for a gated model, under the model's current
|
|
246
|
+
active agreement.
|
|
246
247
|
|
|
247
248
|
Args:
|
|
248
|
-
request (
|
|
249
|
+
request (ApiReviewModelGatingUserConsentRequest):
|
|
249
250
|
The request object; initialized to empty instance if not specified.
|
|
250
251
|
"""
|
|
251
252
|
|
|
252
253
|
if request is None:
|
|
253
|
-
request =
|
|
254
|
+
request = ApiReviewModelGatingUserConsentRequest()
|
|
254
255
|
|
|
255
|
-
self._client.call("models.ModelApiService", "
|
|
256
|
+
self._client.call("models.ModelApiService", "ApiReviewModelGatingUserConsent", request, None)
|
|
@@ -2226,34 +2226,49 @@ class ApiModelInstance(KaggleObject):
|
|
|
2226
2226
|
self._total_uncompressed_bytes = total_uncompressed_bytes
|
|
2227
2227
|
|
|
2228
2228
|
|
|
2229
|
-
class
|
|
2229
|
+
class ApiReviewModelGatingUserConsentRequest(KaggleObject):
|
|
2230
2230
|
r"""
|
|
2231
2231
|
Attributes:
|
|
2232
|
-
|
|
2232
|
+
owner_slug (str)
|
|
2233
|
+
model_slug (str)
|
|
2233
2234
|
user_name (str)
|
|
2234
2235
|
review_status (GatingAgreementRequestsReviewStatus)
|
|
2235
2236
|
publisher_notes (str)
|
|
2236
2237
|
"""
|
|
2237
2238
|
|
|
2238
2239
|
def __init__(self):
|
|
2239
|
-
self.
|
|
2240
|
+
self._owner_slug = ""
|
|
2241
|
+
self._model_slug = ""
|
|
2240
2242
|
self._user_name = ""
|
|
2241
2243
|
self._review_status = GatingAgreementRequestsReviewStatus.GATING_AGREEMENT_REQUESTS_REVIEW_STATUS_UNSPECIFIED
|
|
2242
2244
|
self._publisher_notes = None
|
|
2243
2245
|
self._freeze()
|
|
2244
2246
|
|
|
2245
2247
|
@property
|
|
2246
|
-
def
|
|
2247
|
-
return self.
|
|
2248
|
+
def owner_slug(self) -> str:
|
|
2249
|
+
return self._owner_slug
|
|
2248
2250
|
|
|
2249
|
-
@
|
|
2250
|
-
def
|
|
2251
|
-
if
|
|
2252
|
-
del self.
|
|
2251
|
+
@owner_slug.setter
|
|
2252
|
+
def owner_slug(self, owner_slug: str):
|
|
2253
|
+
if owner_slug is None:
|
|
2254
|
+
del self.owner_slug
|
|
2253
2255
|
return
|
|
2254
|
-
if not isinstance(
|
|
2255
|
-
raise TypeError('
|
|
2256
|
-
self.
|
|
2256
|
+
if not isinstance(owner_slug, str):
|
|
2257
|
+
raise TypeError('owner_slug must be of type str')
|
|
2258
|
+
self._owner_slug = owner_slug
|
|
2259
|
+
|
|
2260
|
+
@property
|
|
2261
|
+
def model_slug(self) -> str:
|
|
2262
|
+
return self._model_slug
|
|
2263
|
+
|
|
2264
|
+
@model_slug.setter
|
|
2265
|
+
def model_slug(self, model_slug: str):
|
|
2266
|
+
if model_slug is None:
|
|
2267
|
+
del self.model_slug
|
|
2268
|
+
return
|
|
2269
|
+
if not isinstance(model_slug, str):
|
|
2270
|
+
raise TypeError('model_slug must be of type str')
|
|
2271
|
+
self._model_slug = model_slug
|
|
2257
2272
|
|
|
2258
2273
|
@property
|
|
2259
2274
|
def user_name(self) -> str:
|
|
@@ -2295,7 +2310,7 @@ class ApiReviewGatingUserConsentRequest(KaggleObject):
|
|
|
2295
2310
|
self._publisher_notes = publisher_notes
|
|
2296
2311
|
|
|
2297
2312
|
def endpoint(self):
|
|
2298
|
-
path = '/api/v1/
|
|
2313
|
+
path = '/api/v1/models/{owner_slug}/{model_slug}/user-consents/review'
|
|
2299
2314
|
return path.format_map(self.to_field_map(self))
|
|
2300
2315
|
|
|
2301
2316
|
|
|
@@ -3599,8 +3614,9 @@ ApiModelInstance._fields = [
|
|
|
3599
3614
|
FieldMetadata("totalUncompressedBytes", "total_uncompressed_bytes", "_total_uncompressed_bytes", int, 0, PredefinedSerializer()),
|
|
3600
3615
|
]
|
|
3601
3616
|
|
|
3602
|
-
|
|
3603
|
-
FieldMetadata("
|
|
3617
|
+
ApiReviewModelGatingUserConsentRequest._fields = [
|
|
3618
|
+
FieldMetadata("ownerSlug", "owner_slug", "_owner_slug", str, "", PredefinedSerializer()),
|
|
3619
|
+
FieldMetadata("modelSlug", "model_slug", "_model_slug", str, "", PredefinedSerializer()),
|
|
3604
3620
|
FieldMetadata("userName", "user_name", "_user_name", str, "", PredefinedSerializer()),
|
|
3605
3621
|
FieldMetadata("reviewStatus", "review_status", "_review_status", GatingAgreementRequestsReviewStatus, GatingAgreementRequestsReviewStatus.GATING_AGREEMENT_REQUESTS_REVIEW_STATUS_UNSPECIFIED, EnumSerializer()),
|
|
3606
3622
|
FieldMetadata("publisherNotes", "publisher_notes", "_publisher_notes", str, None, PredefinedSerializer(), optional=True),
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from kagglesdk.common.types.http_redirect import HttpRedirect
|
|
2
|
+
from kagglesdk.kaggle_http_client import KaggleHttpClient
|
|
3
|
+
from kagglesdk.security.types.oauth_service import ExchangeOAuthTokenRequest, ExchangeOAuthTokenResponse, StartOAuthFlowRequest
|
|
4
|
+
|
|
5
|
+
class OAuthClient(object):
|
|
6
|
+
|
|
7
|
+
def __init__(self, client: KaggleHttpClient):
|
|
8
|
+
self._client = client
|
|
9
|
+
|
|
10
|
+
def start_oauth_flow(self, request: StartOAuthFlowRequest = None) -> HttpRedirect:
|
|
11
|
+
r"""
|
|
12
|
+
Args:
|
|
13
|
+
request (StartOAuthFlowRequest):
|
|
14
|
+
The request object; initialized to empty instance if not specified.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
if request is None:
|
|
18
|
+
request = StartOAuthFlowRequest()
|
|
19
|
+
|
|
20
|
+
return self._client.call("security.OAuthService", "StartOAuthFlow", request, HttpRedirect)
|
|
21
|
+
|
|
22
|
+
def exchange_oauth_token(self, request: ExchangeOAuthTokenRequest = None) -> ExchangeOAuthTokenResponse:
|
|
23
|
+
r"""
|
|
24
|
+
Args:
|
|
25
|
+
request (ExchangeOAuthTokenRequest):
|
|
26
|
+
The request object; initialized to empty instance if not specified.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
if request is None:
|
|
30
|
+
request = ExchangeOAuthTokenRequest()
|
|
31
|
+
|
|
32
|
+
return self._client.call("security.OAuthService", "ExchangeOAuthToken", request, ExchangeOAuthTokenResponse)
|
|
File without changes
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
from kagglesdk.kaggle_object import *
|
|
2
|
+
from typing import Optional, List
|
|
3
|
+
|
|
4
|
+
class AuthorizationScope(KaggleObject):
|
|
5
|
+
r"""
|
|
6
|
+
Attributes:
|
|
7
|
+
resource_id (int)
|
|
8
|
+
permission (AuthorizationPermissionScope)
|
|
9
|
+
role (AuthorizationRoleScope)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def __init__(self):
|
|
13
|
+
self._resource_id = 0
|
|
14
|
+
self._permission = None
|
|
15
|
+
self._role = None
|
|
16
|
+
self._freeze()
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def resource_id(self) -> int:
|
|
20
|
+
return self._resource_id
|
|
21
|
+
|
|
22
|
+
@resource_id.setter
|
|
23
|
+
def resource_id(self, resource_id: int):
|
|
24
|
+
if resource_id is None:
|
|
25
|
+
del self.resource_id
|
|
26
|
+
return
|
|
27
|
+
if not isinstance(resource_id, int):
|
|
28
|
+
raise TypeError('resource_id must be of type int')
|
|
29
|
+
self._resource_id = resource_id
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def permission(self) -> Optional['AuthorizationPermissionScope']:
|
|
33
|
+
return self._permission or None
|
|
34
|
+
|
|
35
|
+
@permission.setter
|
|
36
|
+
def permission(self, permission: Optional['AuthorizationPermissionScope']):
|
|
37
|
+
if permission is None:
|
|
38
|
+
del self.permission
|
|
39
|
+
return
|
|
40
|
+
if not isinstance(permission, AuthorizationPermissionScope):
|
|
41
|
+
raise TypeError('permission must be of type AuthorizationPermissionScope')
|
|
42
|
+
del self.role
|
|
43
|
+
self._permission = permission
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def role(self) -> Optional['AuthorizationRoleScope']:
|
|
47
|
+
return self._role or None
|
|
48
|
+
|
|
49
|
+
@role.setter
|
|
50
|
+
def role(self, role: Optional['AuthorizationRoleScope']):
|
|
51
|
+
if role is None:
|
|
52
|
+
del self.role
|
|
53
|
+
return
|
|
54
|
+
if not isinstance(role, AuthorizationRoleScope):
|
|
55
|
+
raise TypeError('role must be of type AuthorizationRoleScope')
|
|
56
|
+
del self.permission
|
|
57
|
+
self._role = role
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class AuthorizationPermissionScope(KaggleObject):
|
|
61
|
+
r"""
|
|
62
|
+
Attributes:
|
|
63
|
+
name (str)
|
|
64
|
+
description (str)
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
def __init__(self):
|
|
68
|
+
self._name = ""
|
|
69
|
+
self._description = None
|
|
70
|
+
self._freeze()
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def name(self) -> str:
|
|
74
|
+
return self._name
|
|
75
|
+
|
|
76
|
+
@name.setter
|
|
77
|
+
def name(self, name: str):
|
|
78
|
+
if name is None:
|
|
79
|
+
del self.name
|
|
80
|
+
return
|
|
81
|
+
if not isinstance(name, str):
|
|
82
|
+
raise TypeError('name must be of type str')
|
|
83
|
+
self._name = name
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def description(self) -> str:
|
|
87
|
+
return self._description or ""
|
|
88
|
+
|
|
89
|
+
@description.setter
|
|
90
|
+
def description(self, description: str):
|
|
91
|
+
if description is None:
|
|
92
|
+
del self.description
|
|
93
|
+
return
|
|
94
|
+
if not isinstance(description, str):
|
|
95
|
+
raise TypeError('description must be of type str')
|
|
96
|
+
self._description = description
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class AuthorizationRoleScope(KaggleObject):
|
|
100
|
+
r"""
|
|
101
|
+
Attributes:
|
|
102
|
+
name (str)
|
|
103
|
+
description (str)
|
|
104
|
+
permissions (AuthorizationPermissionScope)
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
def __init__(self):
|
|
108
|
+
self._name = ""
|
|
109
|
+
self._description = None
|
|
110
|
+
self._permissions = []
|
|
111
|
+
self._freeze()
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def name(self) -> str:
|
|
115
|
+
return self._name
|
|
116
|
+
|
|
117
|
+
@name.setter
|
|
118
|
+
def name(self, name: str):
|
|
119
|
+
if name is None:
|
|
120
|
+
del self.name
|
|
121
|
+
return
|
|
122
|
+
if not isinstance(name, str):
|
|
123
|
+
raise TypeError('name must be of type str')
|
|
124
|
+
self._name = name
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def description(self) -> str:
|
|
128
|
+
return self._description or ""
|
|
129
|
+
|
|
130
|
+
@description.setter
|
|
131
|
+
def description(self, description: str):
|
|
132
|
+
if description is None:
|
|
133
|
+
del self.description
|
|
134
|
+
return
|
|
135
|
+
if not isinstance(description, str):
|
|
136
|
+
raise TypeError('description must be of type str')
|
|
137
|
+
self._description = description
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def permissions(self) -> Optional[List[Optional['AuthorizationPermissionScope']]]:
|
|
141
|
+
return self._permissions
|
|
142
|
+
|
|
143
|
+
@permissions.setter
|
|
144
|
+
def permissions(self, permissions: Optional[List[Optional['AuthorizationPermissionScope']]]):
|
|
145
|
+
if permissions is None:
|
|
146
|
+
del self.permissions
|
|
147
|
+
return
|
|
148
|
+
if not isinstance(permissions, list):
|
|
149
|
+
raise TypeError('permissions must be of type list')
|
|
150
|
+
if not all([isinstance(t, AuthorizationPermissionScope) for t in permissions]):
|
|
151
|
+
raise TypeError('permissions must contain only items of type AuthorizationPermissionScope')
|
|
152
|
+
self._permissions = permissions
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
AuthorizationScope._fields = [
|
|
156
|
+
FieldMetadata("resourceId", "resource_id", "_resource_id", int, 0, PredefinedSerializer()),
|
|
157
|
+
FieldMetadata("permission", "permission", "_permission", AuthorizationPermissionScope, None, KaggleObjectSerializer(), optional=True),
|
|
158
|
+
FieldMetadata("role", "role", "_role", AuthorizationRoleScope, None, KaggleObjectSerializer(), optional=True),
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
AuthorizationPermissionScope._fields = [
|
|
162
|
+
FieldMetadata("name", "name", "_name", str, "", PredefinedSerializer()),
|
|
163
|
+
FieldMetadata("description", "description", "_description", str, None, PredefinedSerializer(), optional=True),
|
|
164
|
+
]
|
|
165
|
+
|
|
166
|
+
AuthorizationRoleScope._fields = [
|
|
167
|
+
FieldMetadata("name", "name", "_name", str, "", PredefinedSerializer()),
|
|
168
|
+
FieldMetadata("description", "description", "_description", str, None, PredefinedSerializer(), optional=True),
|
|
169
|
+
FieldMetadata("permissions", "permissions", "_permissions", AuthorizationPermissionScope, [], ListSerializer(KaggleObjectSerializer())),
|
|
170
|
+
]
|
|
171
|
+
|