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.
Files changed (40) hide show
  1. kaggle/api/kaggle_api.py +92 -79
  2. kaggle/api/kaggle_api_extended.py +907 -876
  3. kaggle/configuration.py +3 -3
  4. kaggle/models/dataset_column.py +58 -49
  5. kaggle/models/dataset_new_request.py +47 -31
  6. kaggle/models/dataset_new_version_request.py +56 -31
  7. kaggle/models/dataset_update_settings_request.py +58 -32
  8. kaggle/models/kernel_push_request.py +86 -51
  9. kaggle/models/model_instance_new_version_request.py +20 -12
  10. kaggle/models/model_instance_update_request.py +68 -37
  11. kaggle/models/model_new_instance_request.py +85 -47
  12. kaggle/models/model_new_request.py +26 -19
  13. kaggle/models/model_update_request.py +34 -23
  14. kaggle/models/start_blob_upload_request.py +60 -49
  15. kaggle/models/start_blob_upload_response.py +27 -22
  16. kaggle/models/upload_file.py +33 -31
  17. {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/METADATA +1 -1
  18. {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/RECORD +40 -31
  19. kagglesdk/__init__.py +1 -1
  20. kagglesdk/datasets/types/dataset_api_service.py +16 -0
  21. kagglesdk/kaggle_client.py +12 -0
  22. kagglesdk/kaggle_env.py +9 -11
  23. kagglesdk/kaggle_http_client.py +91 -56
  24. kagglesdk/kaggle_object.py +97 -42
  25. kagglesdk/kernels/types/kernels_api_service.py +24 -0
  26. kagglesdk/models/services/model_api_service.py +7 -6
  27. kagglesdk/models/types/model_api_service.py +31 -15
  28. kagglesdk/security/__init__.py +0 -0
  29. kagglesdk/security/services/__init__.py +0 -0
  30. kagglesdk/security/services/oauth_service.py +32 -0
  31. kagglesdk/security/types/__init__.py +0 -0
  32. kagglesdk/security/types/authentication.py +171 -0
  33. kagglesdk/security/types/oauth_service.py +394 -0
  34. kagglesdk/test/test_client.py +4 -6
  35. kagglesdk/users/services/__init__.py +0 -0
  36. kagglesdk/users/services/account_service.py +19 -0
  37. kagglesdk/users/types/account_service.py +204 -0
  38. {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/WHEEL +0 -0
  39. {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/entry_points.txt +0 -0
  40. {kaggle-1.7.4.2.dist-info → kaggle-1.7.4.5.dist-info}/licenses/LICENSE.txt +0 -0
@@ -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
- A token referencing a specific file upload that can be used across requests # noqa: E501
66
+ A token referencing a specific file upload that can be used across
67
+ requests # noqa: E501
67
68
 
68
- :return: The token of this UploadFile. # noqa: E501
69
- :rtype: str
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
- A token referencing a specific file upload that can be used across requests # noqa: E501
78
+ A token referencing a specific file upload that can be used across
79
+ requests # noqa: E501
78
80
 
79
- :param token: The token of this UploadFile. # noqa: E501
80
- :type: str
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
- The file description # noqa: E501
91
+ The file description # noqa: E501
90
92
 
91
- :return: The description of this UploadFile. # noqa: E501
92
- :rtype: str
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
- The file description # noqa: E501
102
+ The file description # noqa: E501
101
103
 
102
- :param description: The description of this UploadFile. # noqa: E501
103
- :type: str
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
- A list of dataset column metadata # noqa: E501
114
+ A list of dataset column metadata # noqa: E501
113
115
 
114
- :return: The columns of this UploadFile. # noqa: E501
115
- :rtype: list[DatasetColumn]
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
- A list of dataset column metadata # noqa: E501
125
+ A list of dataset column metadata # noqa: E501
124
126
 
125
- :param columns: The columns of this UploadFile. # noqa: E501
126
- :type: list[DatasetColumn]
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaggle
3
- Version: 1.7.4.2
3
+ Version: 1.7.4.5
4
4
  Summary: Access Kaggle resources anywhere
5
5
  Project-URL: Homepage, https://github.com/Kaggle/kaggle-api
6
6
  Project-URL: Issues, https://github.com/Kaggle/kaggle-api/issues
@@ -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=rgBGwX_iQnHMerDO0oOJJDClq_VRQeKmg0XMfgn5mzg,6069
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=vyvS-HH2sEftKYxl1Y4nQWSbDXYW57NXDcezQKECtac,24828
7
- kaggle/api/kaggle_api_extended.py,sha256=cblrXw6TpIiBlUMc0SFk0J-TryH3JBJFY7KYai8Bvds,185820
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=q1cQnOHPVEV8olnpwAHnB4z7w9AHMGR2iA6OKZaLKKE,6768
11
- kaggle/models/dataset_new_request.py,sha256=kJ2az668iDTXAE18XQOyD8M5w0_teQwjXoCZn67Q09k,12186
12
- kaggle/models/dataset_new_version_request.py,sha256=PcbrYife2VBTHji6KX5zRS79fJVXDVSkLU3qXRWaUWc,9332
13
- kaggle/models/dataset_update_settings_request.py,sha256=luybsR3typrKKqdmlJIUb7Nzrgih0EU4DD7NUW2PVtY,9426
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=mFzHNkyirbeMfYsxizX-XUhTAfESZaGXvI2Ll1baPNk,19278
16
- kaggle/models/model_instance_new_version_request.py,sha256=Mi8sgb7yPvgxSOtFzI_HrZLfipqTR6KYzT0Rxsyi_WE,4526
17
- kaggle/models/model_instance_update_request.py,sha256=YMHo7G3H3AsiZWuQpR53JGOP0VySlHGuzug2N4_RgbQ,13625
18
- kaggle/models/model_new_instance_request.py,sha256=O2cWriVgGYeOK_e-Ft0J8OVhrizbflprK4jygZzP460,16074
19
- kaggle/models/model_new_request.py,sha256=87no0q1MhqWyzzgBTNCVAtbGobeEldsaQdmfovclSBc,9376
20
- kaggle/models/model_update_request.py,sha256=cLKv-KdXzqOx16KqXzt6GLjwJVTdrE43lmQcaV3TIak,8446
21
- kaggle/models/start_blob_upload_request.py,sha256=ylocFhngpaGx3g7gzI4zja4xOYGaNqeQ8Pk0fLUQmpw,7219
22
- kaggle/models/start_blob_upload_response.py,sha256=vPuW8kpR9w1EqKWyJQHlAkFTu9FG2UufISZg73yGZjY,4197
23
- kaggle/models/upload_file.py,sha256=0wouJIbb7K-voEah9JrognMuJP_EGQrf96mcsy1AEsI,4787
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=IJFgr7644bKJJb8xPv9SwE4y7ZFff2kaO9fqFCPZMLI,91
28
- kagglesdk/kaggle_client.py,sha256=ZAONI1jbSlQE97RtxlSm07LReYwkGoVab22nrTmQTxU,2779
29
- kagglesdk/kaggle_env.py,sha256=0R-RIbO09nud9eZsb9YB72W9enI92j4jmgVxILj-AkQ,1146
30
- kagglesdk/kaggle_http_client.py,sha256=aGWaU98cw4IdEM95sC1GmX6IqF5JOE5rhK5mNHczum8,10172
31
- kagglesdk/kaggle_object.py,sha256=eng8cWtDwkAKS4kbjXSfnpN_7PfpCyLlQRz8Lnpk6_w,10787
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=vkBsU4BpDeA_MlCU0oLcnJbvKL-IiCyfae_ZkjTXJns,80375
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=nO-S6NFnBdC-PBzNkKHcL61muJUOMdsfKtmckAVhE7Y,61371
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=vF7NH0MAZoX_b0z3RqGhjdAiuaWU_ACNRDLjUN2HC3M,10145
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=dDabW7I8MaRuz-iOBSlx_vQPWF8mEig678DusyvxHIk,111682
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/test/test_client.py,sha256=Z5hkIE7EeoM5bUfgAqid1YuZ1EAkzvw_PFIZiy0X3UQ,1084
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.2.dist-info/METADATA,sha256=EKBrRlTOAHAd8E67ulK9mQ8SjayhD5191SP0cdriyFc,16953
86
- kaggle-1.7.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
87
- kaggle-1.7.4.2.dist-info/entry_points.txt,sha256=hl3dQAS4qpVkC5FWiqfnU6qKJU924OEN6PsHEiw-FGg,43
88
- kaggle-1.7.4.2.dist-info/licenses/LICENSE.txt,sha256=IzhfWrxIlFAci3lzZCg5WWHZJBI1QSzsHxO0plI63vk,11541
89
- kaggle-1.7.4.2.dist-info/RECORD,,
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 = [
@@ -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 # qa.kaggle.com
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
- 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",
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
- raise Exception('Must specify KaggleEnv or set KAGGLE_API_ENVIRONMENT env var')
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}"')
@@ -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 = ['ApiUploadDatasetFileRequest', 'ApiCreateSubmissionRequest', 'ApiCreateCodeSubmissionRequest', 'ApiStartSubmissionUploadRequest', 'ApiUploadModelFileRequest']
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 {to_lower_camel_case(k): clean_data(v) for k, v in data.items() if v is not None}
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 "".join(x.capitalize() for x in snake_str.lower().split("_"))
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 = "CSRF-TOKEN"
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__(self,
84
- env: KaggleEnv = None,
85
- verbose: bool = False,
86
- renew_iap_token=None,
87
- username=None,
88
- password=None):
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(self, service_name: str, request_name: str, request: KaggleObject,
98
- response_type: Type[KaggleObject]):
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
- http_response = self._session.send(http_request)
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(self, service_name: str, request_name: str,
108
- request: KaggleObject):
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
- 'Accept': 'application/json',
124
- 'Content-Type': 'text/plain',
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
- 'Accept': 'application/json',
141
- 'Content-Type': content_type,
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
- method=method,
145
- url=request_url,
146
- data=data,
147
- headers=self._session.headers,
148
- # cookies=self._get_xsrf_cookies(),
149
- auth=self._session.auth)
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
- f'{request.method} {request.url}\n{_headers_to_str(request.headers)}\n\n{request.body}'
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
- 'User-Agent': 'kaggle-api/v1.7.0', # Was: V2
210
- 'Content-Type': 'application/x-www-form-urlencoded', # Was: /json
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
- # https://cloud.google.com/iap/docs/authentication-howto#authenticating_from_proxy-authorization_header
217
- 'Proxy-Authorization': f'Bearer {iap_token}',
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
- method='GET',
234
- url=self._endpoint,
235
- headers=self._session.headers,
236
- auth=self._session.auth)
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
- KaggleHttpClient._xsrf_header_name:
249
- self._session.cookies[KaggleHttpClient._xsrf_cookie_name],
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["Authorization"] = f"Bearer {self.token}"
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("utf-8")[3]
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"--{boundary}\r\n".encode("latin-1"))
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"\r\n")
341
+ body.write(b'\r\n')
307
342
 
308
- body.write(f"--{boundary}--\r\n".encode("latin-1"))
343
+ body.write(f'--{boundary}--\r\n'.encode('latin-1'))
309
344
 
310
- content_type = f"multipart/form-data; boundary={boundary}"
345
+ content_type = f'multipart/form-data; boundary={boundary}'
311
346
 
312
347
  return body.getvalue(), content_type
313
348