kaggle 1.7.4.5__py3-none-any.whl → 1.8.2__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.
Files changed (110) hide show
  1. kaggle/__init__.py +10 -6
  2. kaggle/api/kaggle_api.py +574 -598
  3. kaggle/api/kaggle_api_extended.py +5251 -4769
  4. kaggle/cli.py +1335 -1585
  5. kaggle/models/api_blob_type.py +3 -3
  6. kaggle/models/dataset_column.py +165 -174
  7. kaggle/models/dataset_new_request.py +83 -41
  8. kaggle/models/dataset_new_version_request.py +32 -25
  9. kaggle/models/dataset_update_settings_request.py +35 -27
  10. kaggle/models/kaggle_models_extended.py +169 -172
  11. kaggle/models/kernel_push_request.py +66 -49
  12. kaggle/models/model_instance_new_version_request.py +10 -18
  13. kaggle/models/model_instance_update_request.py +103 -34
  14. kaggle/models/model_new_instance_request.py +138 -41
  15. kaggle/models/model_new_request.py +35 -27
  16. kaggle/models/model_update_request.py +32 -25
  17. kaggle/models/start_blob_upload_request.py +192 -195
  18. kaggle/models/start_blob_upload_response.py +98 -98
  19. kaggle/models/upload_file.py +114 -120
  20. kaggle/test/test_authenticate.py +23 -23
  21. {kaggle-1.7.4.5.dist-info → kaggle-1.8.2.dist-info}/METADATA +12 -15
  22. kaggle-1.8.2.dist-info/RECORD +148 -0
  23. kagglesdk/__init__.py +5 -1
  24. kagglesdk/benchmarks/services/__init__.py +0 -0
  25. kagglesdk/benchmarks/services/benchmarks_api_service.py +19 -0
  26. kagglesdk/benchmarks/types/__init__.py +0 -0
  27. kagglesdk/benchmarks/types/benchmark_types.py +307 -0
  28. kagglesdk/benchmarks/types/benchmarks_api_service.py +243 -0
  29. kagglesdk/blobs/services/blob_api_service.py +1 -1
  30. kagglesdk/blobs/types/blob_api_service.py +2 -2
  31. kagglesdk/common/services/__init__.py +0 -0
  32. kagglesdk/common/services/operations_service.py +46 -0
  33. kagglesdk/common/types/file_download.py +1 -1
  34. kagglesdk/common/types/http_redirect.py +1 -1
  35. kagglesdk/common/types/operations.py +194 -0
  36. kagglesdk/common/types/operations_service.py +48 -0
  37. kagglesdk/community/__init__.py +0 -0
  38. kagglesdk/community/types/__init__.py +0 -0
  39. kagglesdk/community/types/content_enums.py +44 -0
  40. kagglesdk/community/types/organization.py +410 -0
  41. kagglesdk/competitions/services/competition_api_service.py +49 -12
  42. kagglesdk/competitions/types/competition.py +14 -0
  43. kagglesdk/competitions/types/competition_api_service.py +1639 -1275
  44. kagglesdk/competitions/types/search_competitions.py +28 -0
  45. kagglesdk/datasets/databundles/__init__.py +0 -0
  46. kagglesdk/datasets/databundles/types/__init__.py +0 -0
  47. kagglesdk/datasets/databundles/types/databundle_api_types.py +540 -0
  48. kagglesdk/datasets/services/dataset_api_service.py +39 -14
  49. kagglesdk/datasets/types/dataset_api_service.py +554 -300
  50. kagglesdk/datasets/types/dataset_enums.py +21 -0
  51. kagglesdk/datasets/types/dataset_service.py +145 -0
  52. kagglesdk/datasets/types/dataset_types.py +74 -74
  53. kagglesdk/datasets/types/search_datasets.py +6 -0
  54. kagglesdk/discussions/__init__.py +0 -0
  55. kagglesdk/discussions/types/__init__.py +0 -0
  56. kagglesdk/discussions/types/search_discussions.py +43 -0
  57. kagglesdk/discussions/types/writeup_enums.py +11 -0
  58. kagglesdk/education/services/education_api_service.py +1 -1
  59. kagglesdk/education/types/education_api_service.py +1 -1
  60. kagglesdk/kaggle_client.py +46 -23
  61. kagglesdk/kaggle_creds.py +148 -0
  62. kagglesdk/kaggle_env.py +89 -25
  63. kagglesdk/kaggle_http_client.py +224 -306
  64. kagglesdk/kaggle_oauth.py +200 -0
  65. kagglesdk/kaggle_object.py +286 -293
  66. kagglesdk/kernels/services/kernels_api_service.py +46 -9
  67. kagglesdk/kernels/types/kernels_api_service.py +635 -159
  68. kagglesdk/kernels/types/kernels_enums.py +6 -0
  69. kagglesdk/kernels/types/search_kernels.py +6 -0
  70. kagglesdk/licenses/__init__.py +0 -0
  71. kagglesdk/licenses/types/__init__.py +0 -0
  72. kagglesdk/licenses/types/licenses_types.py +182 -0
  73. kagglesdk/models/services/model_api_service.py +41 -17
  74. kagglesdk/models/types/model_api_service.py +987 -637
  75. kagglesdk/models/types/model_enums.py +8 -0
  76. kagglesdk/models/types/model_service.py +71 -71
  77. kagglesdk/models/types/model_types.py +1057 -5
  78. kagglesdk/models/types/search_models.py +8 -0
  79. kagglesdk/search/__init__.py +0 -0
  80. kagglesdk/search/services/__init__.py +0 -0
  81. kagglesdk/search/services/search_api_service.py +19 -0
  82. kagglesdk/search/types/__init__.py +0 -0
  83. kagglesdk/search/types/search_api_service.py +2435 -0
  84. kagglesdk/search/types/search_content_shared.py +50 -0
  85. kagglesdk/search/types/search_enums.py +45 -0
  86. kagglesdk/search/types/search_service.py +303 -0
  87. kagglesdk/security/services/iam_service.py +31 -0
  88. kagglesdk/security/services/oauth_service.py +27 -1
  89. kagglesdk/security/types/authentication.py +63 -63
  90. kagglesdk/security/types/iam_service.py +496 -0
  91. kagglesdk/security/types/oauth_service.py +797 -10
  92. kagglesdk/security/types/roles.py +8 -0
  93. kagglesdk/security/types/security_types.py +159 -0
  94. kagglesdk/test/__init__.py +0 -0
  95. kagglesdk/test/test_client.py +20 -22
  96. kagglesdk/users/services/account_service.py +13 -1
  97. kagglesdk/users/services/group_api_service.py +31 -0
  98. kagglesdk/users/types/account_service.py +169 -28
  99. kagglesdk/users/types/group_api_service.py +315 -0
  100. kagglesdk/users/types/group_types.py +165 -0
  101. kagglesdk/users/types/groups_enum.py +8 -0
  102. kagglesdk/users/types/progression_service.py +9 -0
  103. kagglesdk/users/types/search_users.py +23 -0
  104. kagglesdk/users/types/user_avatar.py +226 -0
  105. kaggle/configuration.py +0 -206
  106. kaggle-1.7.4.5.dist-info/RECORD +0 -98
  107. {kaggle-1.7.4.5.dist-info → kaggle-1.8.2.dist-info}/WHEEL +0 -0
  108. {kaggle-1.7.4.5.dist-info → kaggle-1.8.2.dist-info}/entry_points.txt +0 -0
  109. {kaggle-1.7.4.5.dist-info → kaggle-1.8.2.dist-info}/licenses/LICENSE.txt +0 -0
  110. {kaggle/test → kagglesdk/benchmarks}/__init__.py +0 -0
@@ -6,346 +6,339 @@ from google.protobuf.field_mask_pb2 import FieldMask
6
6
 
7
7
  class ObjectSerializer(object):
8
8
 
9
- def __init__(self, to_dict_value, from_dict_value):
10
- self.to_dict_value = to_dict_value
11
- self.from_dict_value = from_dict_value
9
+ def __init__(self, to_dict_value, from_dict_value):
10
+ self.to_dict_value = to_dict_value
11
+ self.from_dict_value = from_dict_value
12
12
 
13
13
 
14
14
  class PredefinedSerializer(ObjectSerializer):
15
15
 
16
- def __init__(self):
17
- """Predefined objects such as int, float etc are serialized/deserialized directly."""
18
- ObjectSerializer.__init__(self, lambda cls, v, _: v, lambda cls, v: v)
16
+ def __init__(self):
17
+ """Predefined objects such as int, float etc are serialized/deserialized directly."""
18
+ ObjectSerializer.__init__(self, lambda cls, v, _: v, lambda cls, v: v)
19
19
 
20
20
 
21
21
  # Adapted from https://stackoverflow.com/questions/1175208/elegant-python-function-to-convert-camelcase-to-snake-case
22
- _pascal_to_upper_snake_case_regex = re.compile(
23
- '((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))'
24
- )
22
+ _pascal_to_upper_snake_case_regex = re.compile("((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))")
25
23
 
26
24
 
27
25
  def _pascal_case_to_upper_snake_case(string):
28
- return _pascal_to_upper_snake_case_regex.sub(r'_\1', string).upper()
26
+ return _pascal_to_upper_snake_case_regex.sub(r"_\1", string).upper()
29
27
 
30
28
 
31
29
  def _convert(camel_input):
32
- words = re.findall(r'[A-Z]?[a-z]+|[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)|\d+', camel_input)
33
- return '_'.join(map(str.lower, words))
30
+ words = re.findall(r"[A-Z]?[a-z]+|[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)|\d+", camel_input)
31
+ return "_".join(map(str.lower, words))
34
32
 
35
33
 
36
34
  class EnumSerializer(ObjectSerializer):
37
35
 
38
- def __init__(self):
39
- """
40
- Enum objects are serialized using their ".name" field and deserialized by indexing the string in the Enum type.
41
- Example:
42
- class Foo(Enum):
43
- TEST = 1
44
- foo = Foo.TEST
45
- foo.name # => returns "TEST"
46
- Foo["TEST"] # => returns Foo.TEST enum value.
47
- """
48
- ObjectSerializer.__init__(
49
- self,
50
- lambda cls, v, _: EnumSerializer._to_str(cls, v),
51
- lambda cls, v: EnumSerializer._from_str(cls, v),
52
- )
53
-
54
- @staticmethod
55
- def _to_str(cls, v):
56
- # "v" corresponds to an enum instance: Example foo or Foo.Test above.
57
- # "cls" corresponds to the enum type Foo above.
58
- # enum_prefix = f'{_pascal_case_to_upper_snake_case(cls.__name__)}_'
59
- # if v.name.startswith(enum_prefix):
60
- # return v.name
61
- # return f'{enum_prefix}{v.name}'
62
- enum_prefix = f'{_pascal_case_to_upper_snake_case(cls.__name__)}_'
63
- if v.name.find(enum_prefix) == 0:
64
- return v.name[len(enum_prefix) :].lower()
65
- return v.name
66
-
67
- @staticmethod
68
- def _from_str(cls, v):
69
- # "v" corresponds to enum string: Example "TEST" above.
70
- # "cls" corresponds to the enum type Foo above.
71
- # enum_items = {item.name: item for item in cls}
72
- # if v in enum_items:
73
- # return enum_items[v]
74
- #
75
- # # Try with enum prefix. Example: EnvironmentType.JSON -> "ENVIRONMENT_TYPE_JSON"
76
- # enum_prefix = _pascal_case_to_upper_snake_case(cls.__name__)
77
- # if v.startswith(enum_prefix):
78
- # ix_start = len(enum_prefix) + 1
79
- # return enum_items[v[ix_start:]]
80
- #
81
- # return enum_items[f'{enum_prefix}_{v}']
82
- try:
83
- return cls[v]
84
- except KeyError:
85
- dct = vars(cls)
86
- n = v.lower()
87
- nn = _convert(v).lower()
88
- enum_prefix = _pascal_case_to_upper_snake_case(cls.__name__).lower()
89
- for key in dct.keys():
90
- k = key.lower()
91
- if k == n:
92
- return dct[key]
93
- if k.startswith(enum_prefix) and k.endswith(n) or k.endswith(nn):
94
- return dct[key]
95
- raise
36
+ def __init__(self):
37
+ """
38
+ Enum objects are serialized using their ".name" field and deserialized by indexing the string in the Enum type.
39
+ Example:
40
+ class Foo(Enum):
41
+ TEST = 1
42
+ foo = Foo.TEST
43
+ foo.name # => returns "TEST"
44
+ Foo["TEST"] # => returns Foo.TEST enum value.
45
+ """
46
+ ObjectSerializer.__init__(
47
+ self,
48
+ lambda cls, v, _: EnumSerializer._to_str(cls, v),
49
+ lambda cls, v: EnumSerializer._from_str(cls, v),
50
+ )
51
+
52
+ @staticmethod
53
+ def _to_str(cls, v):
54
+ # "v" corresponds to an enum instance: Example foo or Foo.Test above.
55
+ # "cls" corresponds to the enum type Foo above.
56
+ return v.name
57
+
58
+ @staticmethod
59
+ def _from_str(cls, v):
60
+ # "v" corresponds to enum string: Example "TEST" above.
61
+ # "cls" corresponds to the enum type Foo above.
62
+ try:
63
+ return cls[v]
64
+ except KeyError:
65
+ dct = vars(cls)
66
+ n = v.lower()
67
+ nn = _convert(v).lower()
68
+ enum_prefix = _pascal_case_to_upper_snake_case(cls.__name__).lower()
69
+ for key in dct.keys():
70
+ k = key.lower()
71
+ if k == n:
72
+ return dct[key]
73
+ if k.startswith(enum_prefix) and k.endswith(n) or k.endswith(nn):
74
+ return dct[key]
75
+ raise
96
76
 
97
77
 
98
78
  class ListSerializer(ObjectSerializer):
99
79
 
100
- def __init__(self, item_serializer: ObjectSerializer):
101
- """
102
- Lists are serialized based on the type they contain. Since objects are generated from proto files, a list always
103
- contains objects of the same type, which is serialized/deserialized using "item_serializer".
104
- """
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
- )
80
+ def __init__(self, item_serializer: ObjectSerializer):
81
+ """
82
+ Lists are serialized based on the type they contain. Since objects are generated from proto files, a list always
83
+ contains objects of the same type, which is serialized/deserialized using "item_serializer".
84
+ """
85
+ ObjectSerializer.__init__(
86
+ self,
87
+ lambda cls, l, ignore_defaults: [item_serializer.to_dict_value(cls, v, ignore_defaults) for v in l],
88
+ lambda cls, l: [item_serializer.from_dict_value(cls, v) for v in l],
89
+ )
112
90
 
113
91
 
114
92
  class MapSerializer(ObjectSerializer):
115
93
 
116
- def __init__(self, item_serializer: ObjectSerializer):
117
- """
118
- Maps are serialized based on type of their values. Since maps keys are always predefined types, we don't need a
119
- serializer for them.
120
- """
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
- )
94
+ def __init__(self, item_serializer: ObjectSerializer):
95
+ """
96
+ Maps are serialized based on type of their values. Since maps keys are always predefined types, we don't need a
97
+ serializer for them.
98
+ """
99
+ ObjectSerializer.__init__(
100
+ self,
101
+ lambda cls, d, ignore_defaults: {
102
+ k: item_serializer.to_dict_value(cls, v, ignore_defaults) for k, v in d.items()
103
+ },
104
+ lambda cls, d: {k: item_serializer.from_dict_value(cls, v) for k, v in d.items()},
105
+ )
131
106
 
132
107
 
133
108
  class DateTimeSerializer(ObjectSerializer):
134
109
 
135
- def __init__(self):
136
- """Date times are serialized/deserialized as a string in iso format"""
137
- ObjectSerializer.__init__(
138
- self,
139
- lambda cls, dt, _: DateTimeSerializer._to_str(dt),
140
- lambda _, v: DateTimeSerializer._from_str(v),
141
- )
142
-
143
- @staticmethod
144
- def _to_str(dt):
145
- return dt.isoformat(timespec='milliseconds') + 'Z'
146
-
147
- @staticmethod
148
- def _from_str(v):
149
- v = v.rstrip('Z')
150
- fields = v.rsplit('.', maxsplit=1)
151
- if len(fields) == 1:
152
- return datetime.fromisoformat(v)
153
- (dt, nanos) = fields
154
- millis = nanos[:3]
155
- try:
156
- return datetime.fromisoformat(f'{dt}.{millis}')
157
- except ValueError:
158
- return datetime.fromisoformat(dt) # Python 3.9, 3.10
110
+ def __init__(self):
111
+ """Date times are serialized/deserialized as a string in iso format"""
112
+ ObjectSerializer.__init__(
113
+ self,
114
+ lambda cls, dt, _: DateTimeSerializer._to_str(dt),
115
+ lambda _, v: DateTimeSerializer._from_str(v),
116
+ )
117
+
118
+ @staticmethod
119
+ def _to_str(dt):
120
+ return dt.isoformat(timespec="milliseconds") + "Z"
121
+
122
+ @staticmethod
123
+ def _from_str(v):
124
+ v = v.rstrip("Z")
125
+ fields = v.rsplit(".", maxsplit=1)
126
+ if len(fields) == 1:
127
+ return datetime.fromisoformat(v)
128
+ (dt, nanos) = fields
129
+ millis = nanos[:3]
130
+ try:
131
+ return datetime.fromisoformat(f"{dt}.{millis}")
132
+ except ValueError:
133
+ return datetime.fromisoformat(dt) # Python 3.9, 3.10
159
134
 
160
135
 
161
136
  class TimeDeltaSerializer(ObjectSerializer):
137
+ # Scaling factors idea from https://github.com/protocolbuffers/protobuf/blob/master/csharp/src/Google.Protobuf/JsonParser.cs
138
+ SUBSECOND_SCALING_FACTORS = [
139
+ 0,
140
+ 100_000_000,
141
+ 10_000_000,
142
+ 1_000_000,
143
+ 100_000,
144
+ 10_000,
145
+ 1_000,
146
+ 100,
147
+ 10,
148
+ 1,
149
+ ]
162
150
 
163
- def __init__(self):
164
- """Time deltas are serialized/deserialized as a string in "mm:ss" format"""
165
- ObjectSerializer.__init__(
166
- self,
167
- lambda cls, t, _: TimeDeltaSerializer._to_dict_value(t),
168
- lambda cls, v: TimeDeltaSerializer._from_dict_value(v),
169
- )
170
-
171
- @staticmethod
172
- def _to_dict_value(delta):
173
- seconds = int(delta.total_seconds())
174
- minutes = seconds // 60
175
- seconds -= minutes * 60
176
- return '{}:{:02}'.format(int(minutes), int(seconds))
177
-
178
- @staticmethod
179
- def _from_dict_value(value):
180
- (minutes, seconds) = value.split(':')
181
- return timedelta(minutes=int(minutes), seconds=int(seconds))
151
+ def __init__(self):
152
+ """Time deltas are serialized/deserialized as a string in "<seconds>.<nanoseconds>s" format. Example: 151.500s"""
153
+ ObjectSerializer.__init__(
154
+ self,
155
+ lambda cls, t, _: TimeDeltaSerializer._to_dict_value(t),
156
+ lambda cls, v: TimeDeltaSerializer._from_dict_value(v),
157
+ )
158
+
159
+ @staticmethod
160
+ def _to_dict_value(delta):
161
+ seconds = delta.seconds
162
+ nanos_str = TimeDeltaSerializer._nanos_to_str(delta.microseconds * 1000)
163
+ if nanos_str is None:
164
+ return "{}s".format(seconds)
165
+ return "{}.{}s".format(seconds, nanos_str)
166
+
167
+ @staticmethod
168
+ def _nanos_to_str(nanos):
169
+ if nanos == 0:
170
+ return None
171
+ if nanos < 0:
172
+ nanos *= -1
173
+ if nanos % 1000000 == 0:
174
+ return "{}".format(nanos / 1000000)
175
+ elif nanos % 1000 == 0:
176
+ return "{}".format(nanos / 1000)
177
+ else:
178
+ return "{}".format(nanos)
179
+
180
+ @staticmethod
181
+ def _from_dict_value(value):
182
+ (seconds, nanosRaw) = value.rstrip("s").split(".")
183
+ nanos = int(nanosRaw) * TimeDeltaSerializer.SUBSECOND_SCALING_FACTORS[len(nanosRaw)]
184
+ return timedelta(seconds=int(seconds), microseconds=int(int(nanos) / 1000))
182
185
 
183
186
 
184
187
  class FieldMaskSerializer(ObjectSerializer):
185
188
 
186
- def __init__(self):
187
- """Field masks are serialized/deserialized as a string that contains a list of paths with a comma delimiter"""
188
- ObjectSerializer.__init__(
189
- self,
190
- lambda cls, m, _: m.ToJsonString(),
191
- lambda cls, v: FieldMaskSerializer._from_joined_paths(v),
192
- )
189
+ def __init__(self):
190
+ """Field masks are serialized/deserialized as a string that contains a list of paths with a comma delimiter"""
191
+ ObjectSerializer.__init__(
192
+ self,
193
+ lambda cls, m, _: m.ToJsonString(),
194
+ lambda cls, v: FieldMaskSerializer._from_joined_paths(v),
195
+ )
193
196
 
194
- @staticmethod
195
- def _from_joined_paths(joined_paths):
196
- mask = FieldMask()
197
- mask.FromJsonString(joined_paths)
198
- return mask
197
+ @staticmethod
198
+ def _from_joined_paths(joined_paths):
199
+ mask = FieldMask()
200
+ mask.FromJsonString(joined_paths)
201
+ return mask
199
202
 
200
203
 
201
204
  class KaggleObjectSerializer(ObjectSerializer):
202
205
 
203
- def __init__(self):
204
- """
205
- Kaggle objects (i.e., proto-generated types that inherit from KaggleObject) have custom "to_dict" and "from_dict"
206
- methods that serialize/deserialize them to/from dictionaries.
207
- """
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
- )
206
+ def __init__(self):
207
+ """
208
+ Kaggle objects (i.e., proto-generated types that inherit from KaggleObject) have custom "to_dict" and "from_dict"
209
+ methods that serialize/deserialize them to/from dictionaries.
210
+ """
211
+ ObjectSerializer.__init__(
212
+ self,
213
+ # "v" is an instance of a KaggleObject. For example: "req = ListCompetitionsRequest()".
214
+ # So "req.to_dict()" returns a dictionary with keys as json field names. Example:
215
+ # '{"pageSize": 10, "page": 2}'
216
+ lambda cls, v, ignore_defaults: cls.to_dict(v, ignore_defaults),
217
+ # "cls" is the type of a KaggleObject. For example: ListCompetitionsRequest. All
218
+ # generated Kaggle objects have "from_dict" class method that takes a dict to create a
219
+ # new instance of the object. See "KaggleObject" class definition below.
220
+ lambda cls, v: cls.from_dict(v),
221
+ )
219
222
 
220
223
 
221
224
  class FieldMetadata(object):
222
225
 
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
- ):
233
- self.json_name = json_name
234
- self.field_name = field_name
235
- self.private_field_name = private_field_name
236
- self.field_type = field_type
237
- self.default_value = default_value
238
- self.serializer = serializer
239
- self.optional = optional
240
-
241
- def get_as_dict_item(self, instance, ignore_defaults=True):
242
- value = getattr(instance, self.private_field_name)
243
- if ignore_defaults and value == self.default_value:
244
- return None
245
- if value is None:
246
- return None
247
- return self.serializer.to_dict_value(self.field_type, value, ignore_defaults)
248
-
249
- def set_from_dict(self, instance, json_dict):
250
- if self.json_name not in json_dict:
251
- return # Ignore unknown fields
252
- value = json_dict[self.json_name]
253
- if value == self.default_value:
254
- return # Ignore default values
255
- try:
256
- setattr(
257
- instance,
258
- self.private_field_name,
259
- self.serializer.from_dict_value(self.field_type, value),
260
- )
261
- except Exception as e:
262
- raise
226
+ def __init__(
227
+ self,
228
+ json_name,
229
+ field_name,
230
+ private_field_name,
231
+ field_type,
232
+ default_value,
233
+ serializer,
234
+ optional=False,
235
+ ):
236
+ self.json_name = json_name
237
+ self.field_name = field_name
238
+ self.private_field_name = private_field_name
239
+ self.field_type = field_type
240
+ self.default_value = default_value
241
+ self.serializer = serializer
242
+ self.optional = optional
243
+
244
+ def get_as_dict_item(self, instance, ignore_defaults=True):
245
+ value = getattr(instance, self.private_field_name)
246
+ if ignore_defaults and value == self.default_value:
247
+ return None
248
+ if value is None:
249
+ return None
250
+ return self.serializer.to_dict_value(self.field_type, value, ignore_defaults)
251
+
252
+ def set_from_dict(self, instance, json_dict):
253
+ if self.json_name not in json_dict:
254
+ return # Ignore unknown fields
255
+ value = json_dict[self.json_name]
256
+ if value == self.default_value:
257
+ return # Ignore default values
258
+ try:
259
+ setattr(
260
+ instance,
261
+ self.private_field_name,
262
+ self.serializer.from_dict_value(self.field_type, value),
263
+ )
264
+ except Exception as e:
265
+ raise
263
266
 
264
267
 
265
268
  class KaggleObject(object):
266
269
 
267
- def endpoint(self):
268
- raise 'Error: endpoint must be defined by the request object'
269
-
270
- @staticmethod
271
- def endpoint_path():
272
- return None
273
-
274
- @staticmethod
275
- def body_fields():
276
- return None
277
-
278
- @classmethod
279
- def prepare_from(cls, http_response):
280
- return cls.from_json(http_response.text)
281
-
282
- @staticmethod
283
- def method():
284
- return 'GET'
285
-
286
- def _freeze(self):
287
- self._is_frozen = True
288
-
289
- def __setattr__(self, key, value):
290
- if hasattr(self, '_is_frozen') and not hasattr(self, key):
291
- raise AttributeError(f'Unknown field for {self.__class__.__name__}: {key}')
292
- object.__setattr__(self, key, value)
293
-
294
- def to_dict(self, ignore_defaults=True):
295
- kv_pairs = [
296
- (field.json_name, field.get_as_dict_item(self, ignore_defaults))
297
- for field in self._fields
298
- ]
299
- return {k: v for (k, v) in kv_pairs if not ignore_defaults or v is not None}
300
-
301
- @staticmethod
302
- def to_field_map(self, ignore_defaults=True):
303
- kv_pairs = [
304
- (field.field_name, field.get_as_dict_item(self, ignore_defaults))
305
- for field in self._fields
306
- ]
307
- return {k: v for (k, v) in kv_pairs if not ignore_defaults or v is not None}
308
-
309
- @classmethod
310
- def from_dict(cls, json_dict):
311
- instance = cls()
312
- for field in cls._fields:
313
- field.set_from_dict(instance, json_dict)
314
- return instance
315
-
316
- @classmethod
317
- def from_json(cls, json_str):
318
- return cls.from_dict(json.loads(json_str))
319
-
320
- @staticmethod
321
- def to_json(self, ignore_defaults=True):
322
- return json.dumps(KaggleObject.to_dict(self, ignore_defaults))
323
-
324
- def __str__(self):
325
- return KaggleObject.to_json(self, ignore_defaults=False)
326
-
327
- def __repr__(self):
328
- return KaggleObject.to_json(self, ignore_defaults=False)
329
-
330
- def __contains__(self, field_name):
331
- try:
332
- field = self._get_field(field_name)
333
- except ValueError:
334
- return False
335
- value = getattr(self, field.private_field_name)
336
- if field.optional:
337
- return value is not None
338
- else:
339
- return value != field.default_value
340
-
341
- def __delattr__(self, field_name):
342
- field = self._get_field(field_name)
343
- setattr(self, field.private_field_name, field.default_value)
344
-
345
- def _get_field(self, field_name):
346
- field = next((f for f in self._fields if f.field_name == field_name), None)
347
- if field is None:
348
- raise ValueError(
349
- f'Protocol message {self.__class__.__name__} has no "{field_name}" field.'
350
- )
351
- return field
270
+ def endpoint(self):
271
+ raise "Error: endpoint must be defined by the request object"
272
+
273
+ @staticmethod
274
+ def endpoint_path():
275
+ return None
276
+
277
+ @staticmethod
278
+ def body_fields():
279
+ return None
280
+
281
+ @classmethod
282
+ def prepare_from(cls, http_response):
283
+ return cls.from_json(http_response.text)
284
+
285
+ @staticmethod
286
+ def method():
287
+ return "GET"
288
+
289
+ def _freeze(self):
290
+ self._is_frozen = True
291
+
292
+ def __setattr__(self, key, value):
293
+ if hasattr(self, "_is_frozen") and not hasattr(self, key):
294
+ raise AttributeError(f"Unknown field for {self.__class__.__name__}: {key}")
295
+ object.__setattr__(self, key, value)
296
+
297
+ def to_dict(self, ignore_defaults=True):
298
+ kv_pairs = [(field.json_name, field.get_as_dict_item(self, ignore_defaults)) for field in self._fields]
299
+ return {k: v for (k, v) in kv_pairs if not ignore_defaults or v is not None}
300
+
301
+ def to_field_map(self, ignore_defaults=True):
302
+ kv_pairs = [(field.field_name, field.get_as_dict_item(self, ignore_defaults)) for field in self._fields]
303
+ return {k: v for (k, v) in kv_pairs if not ignore_defaults or v is not None}
304
+
305
+ @classmethod
306
+ def from_dict(cls, json_dict):
307
+ instance = cls()
308
+ for field in cls._fields:
309
+ field.set_from_dict(instance, json_dict)
310
+ return instance
311
+
312
+ @classmethod
313
+ def from_json(cls, json_str):
314
+ return cls.from_dict(json.loads(json_str))
315
+
316
+ def to_json(self, ignore_defaults=True):
317
+ return json.dumps(self.to_dict(ignore_defaults))
318
+
319
+ def __str__(self):
320
+ return self.to_json(ignore_defaults=False)
321
+
322
+ def __repr__(self):
323
+ return self.to_json(ignore_defaults=False)
324
+
325
+ def __contains__(self, field_name):
326
+ try:
327
+ field = self._get_field(field_name)
328
+ except ValueError:
329
+ return False
330
+ value = getattr(self, field.private_field_name)
331
+ if field.optional:
332
+ return value is not None
333
+ else:
334
+ return value != field.default_value
335
+
336
+ def __delattr__(self, field_name):
337
+ field = self._get_field(field_name)
338
+ setattr(self, field.private_field_name, field.default_value)
339
+
340
+ def _get_field(self, field_name):
341
+ field = next((f for f in self._fields if f.field_name == field_name), None)
342
+ if field is None:
343
+ raise ValueError(f'Protocol message {self.__class__.__name__} has no "{field_name}" field.')
344
+ return field