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