11#!/usr/bin/env python
22
3+ from __future__ import annotations
4+
35import collections
46import contextlib
57import gzip
68import io
79import os
10+ from collections .abc import Iterator
11+ from typing import TYPE_CHECKING , Any
812
913import msgpack
1014
11- from .util import create_url
15+ if TYPE_CHECKING :
16+ from contextlib import AbstractContextManager
17+ from typing import IO
18+
19+ import urllib3
20+
21+ from tdclient .types import BulkImportParams , BytesOrStream , DataFormat , FileLike
22+ from tdclient .util import create_url
1223
1324
1425class BulkImportAPI :
@@ -17,7 +28,27 @@ class BulkImportAPI:
1728 This class is inherited by :class:`tdclient.api.API`.
1829 """
1930
20- def create_bulk_import (self , name , db , table , params = None ):
31+ # Methods from API class
32+ def get (
33+ self , url : str , params : dict [str , Any ] | None = None
34+ ) -> AbstractContextManager [urllib3 .BaseHTTPResponse ]: ...
35+ def post (
36+ self , url : str , params : dict [str , Any ] | None = None
37+ ) -> AbstractContextManager [urllib3 .BaseHTTPResponse ]: ...
38+ def put (
39+ self , url : str , stream : BytesOrStream , size : int
40+ ) -> AbstractContextManager [urllib3 .BaseHTTPResponse ]: ...
41+ def raise_error (
42+ self , msg : str , res : urllib3 .BaseHTTPResponse , body : bytes | str
43+ ) -> None : ...
44+ def checked_json (self , body : bytes , required : list [str ]) -> dict [str , Any ]: ...
45+ def _prepare_file (
46+ self , file : FileLike , format : str , ** kwargs : Any
47+ ) -> IO [bytes ]: ...
48+
49+ def create_bulk_import (
50+ self , name : str , db : str , table : str , params : BulkImportParams | None = None
51+ ) -> bool :
2152 """Enable bulk importing of data to the targeted database and table and stores
2253 it in the default resource pool. Default expiration for bulk import is 30days.
2354
@@ -30,22 +61,24 @@ def create_bulk_import(self, name, db, table, params=None):
3061 Returns:
3162 True if succeeded
3263 """
33- params = {} if params is None else params
64+ post_params = {} if params is None else dict ( params )
3465 with self .post (
3566 create_url (
3667 "/v3/bulk_import/create/{name}/{db}/{table}" ,
3768 name = name ,
3869 db = db ,
3970 table = table ,
4071 ),
41- params ,
72+ post_params ,
4273 ) as res :
4374 code , body = res .status , res .read ()
4475 if code != 200 :
4576 self .raise_error ("Create bulk import failed" , res , body )
4677 return True
4778
48- def delete_bulk_import (self , name , params = None ):
79+ def delete_bulk_import (
80+ self , name : str , params : dict [str , Any ] | None = None
81+ ) -> bool :
4982 """Delete the imported information with the specified name
5083
5184 Args:
@@ -63,7 +96,7 @@ def delete_bulk_import(self, name, params=None):
6396 self .raise_error ("Delete bulk import failed" , res , body )
6497 return True
6598
66- def show_bulk_import (self , name ) :
99+ def show_bulk_import (self , name : str ) -> dict [ str , Any ] :
67100 """Show the details of the bulk import with the specified name
68101
69102 Args:
@@ -78,7 +111,9 @@ def show_bulk_import(self, name):
78111 js = self .checked_json (body , ["status" ])
79112 return js
80113
81- def list_bulk_imports (self , params = None ):
114+ def list_bulk_imports (
115+ self , params : dict [str , Any ] | None = None
116+ ) -> list [dict [str , Any ]]:
82117 """Return the list of available bulk imports
83118 Args:
84119 params (dict, optional): Extra parameters.
@@ -93,7 +128,9 @@ def list_bulk_imports(self, params=None):
93128 js = self .checked_json (body , ["bulk_imports" ])
94129 return js ["bulk_imports" ]
95130
96- def list_bulk_import_parts (self , name , params = None ):
131+ def list_bulk_import_parts (
132+ self , name : str , params : dict [str , Any ] | None = None
133+ ) -> list [str ]:
97134 """Return the list of available parts uploaded through
98135 :func:`~BulkImportAPI.bulk_import_upload_part`.
99136
@@ -114,7 +151,7 @@ def list_bulk_import_parts(self, name, params=None):
114151 return js ["parts" ]
115152
116153 @staticmethod
117- def validate_part_name (part_name ) :
154+ def validate_part_name (part_name : str ) -> None :
118155 """Make sure the part_name is valid
119156
120157 Args:
@@ -133,7 +170,9 @@ def validate_part_name(part_name):
133170 if 0 < part_name .find ("/" ):
134171 raise ValueError ("part name must not contain '/': %s" % (repr (part_name )))
135172
136- def bulk_import_upload_part (self , name , part_name , stream , size ):
173+ def bulk_import_upload_part (
174+ self , name : str , part_name : str , stream : BytesOrStream , size : int
175+ ) -> None :
137176 """Upload bulk import having the specified name and part in the path.
138177
139178 Args:
@@ -156,7 +195,14 @@ def bulk_import_upload_part(self, name, part_name, stream, size):
156195 if code / 100 != 2 :
157196 self .raise_error ("Upload a part failed" , res , body )
158197
159- def bulk_import_upload_file (self , name , part_name , format , file , ** kwargs ):
198+ def bulk_import_upload_file (
199+ self ,
200+ name : str ,
201+ part_name : str ,
202+ format : DataFormat ,
203+ file : FileLike ,
204+ ** kwargs : Any ,
205+ ) -> None :
160206 """Upload a file with bulk import having the specified name.
161207
162208 Args:
@@ -193,7 +239,9 @@ def bulk_import_upload_file(self, name, part_name, format, file, **kwargs):
193239 size = os .fstat (fp .fileno ()).st_size
194240 return self .bulk_import_upload_part (name , part_name , fp , size )
195241
196- def bulk_import_delete_part (self , name , part_name , params = None ):
242+ def bulk_import_delete_part (
243+ self , name : str , part_name : str , params : dict [str , Any ] | None = None
244+ ) -> bool :
197245 """Delete the imported information with the specified name.
198246
199247 Args:
@@ -218,7 +266,9 @@ def bulk_import_delete_part(self, name, part_name, params=None):
218266 self .raise_error ("Delete a part failed" , res , body )
219267 return True
220268
221- def freeze_bulk_import (self , name , params = None ):
269+ def freeze_bulk_import (
270+ self , name : str , params : dict [str , Any ] | None = None
271+ ) -> bool :
222272 """Freeze the bulk import with the specified name.
223273
224274 Args:
@@ -236,7 +286,9 @@ def freeze_bulk_import(self, name, params=None):
236286 self .raise_error ("Freeze bulk import failed" , res , body )
237287 return True
238288
239- def unfreeze_bulk_import (self , name , params = None ):
289+ def unfreeze_bulk_import (
290+ self , name : str , params : dict [str , Any ] | None = None
291+ ) -> bool :
240292 """Unfreeze bulk_import with the specified name.
241293
242294 Args:
@@ -254,7 +306,9 @@ def unfreeze_bulk_import(self, name, params=None):
254306 self .raise_error ("Unfreeze bulk import failed" , res , body )
255307 return True
256308
257- def perform_bulk_import (self , name , params = None ):
309+ def perform_bulk_import (
310+ self , name : str , params : dict [str , Any ] | None = None
311+ ) -> str :
258312 """Execute a job to perform bulk import with the indicated priority using the
259313 resource pool if indicated, else it will use the account's default.
260314
@@ -274,7 +328,9 @@ def perform_bulk_import(self, name, params=None):
274328 js = self .checked_json (body , ["job_id" ])
275329 return str (js ["job_id" ])
276330
277- def commit_bulk_import (self , name , params = None ):
331+ def commit_bulk_import (
332+ self , name : str , params : dict [str , Any ] | None = None
333+ ) -> bool :
278334 """Commit the bulk import information having the specified name.
279335
280336 Args:
@@ -292,7 +348,9 @@ def commit_bulk_import(self, name, params=None):
292348 self .raise_error ("Commit bulk import failed" , res , body )
293349 return True
294350
295- def bulk_import_error_records (self , name , params = None ):
351+ def bulk_import_error_records (
352+ self , name : str , params : dict [str , Any ] | None = None
353+ ) -> Iterator [dict [str , Any ]]:
296354 """List the records that have errors under the specified bulk import name.
297355
298356 Args:
0 commit comments