53
53
import json
54
54
import logging
55
55
import os
56
- import warnings
57
- from typing import Any , Callable , Dict , List , Optional , Union
56
+ from typing import Any , Dict , List , Optional , Union
58
57
59
- import grequests
60
58
import pkg_resources
61
59
import requests
62
60
import tqdm
63
61
import tqdm .notebook as tqdm_notebook
64
- from requests .adapters import HTTPAdapter
65
62
66
63
# pylint: disable=E1101
67
64
# TODO: refactor to reduce this file to under 1000 lines.
68
65
# pylint: disable=C0302
69
- from requests .packages .urllib3 .util .retry import Retry
70
66
71
67
from .annotation import (
72
68
BoxAnnotation ,
73
69
PolygonAnnotation ,
74
- Segment ,
75
70
SegmentationAnnotation ,
76
71
)
77
72
from .constants import (
@@ -145,6 +140,7 @@ def __init__(
145
140
api_key : str ,
146
141
use_notebook : bool = False ,
147
142
endpoint : str = None ,
143
+ verify : bool = True ,
148
144
):
149
145
self .api_key = api_key
150
146
self .tqdm_bar = tqdm .tqdm
@@ -324,13 +320,13 @@ def populate_dataset(
324
320
dataset_id : str ,
325
321
dataset_items : List [DatasetItem ],
326
322
batch_size : int = 100 ,
327
- force : bool = False ,
323
+ update : bool = False ,
328
324
):
329
325
"""
330
326
Appends images to a dataset with given dataset_id.
331
- Overwrites images on collision if forced .
327
+ Overwrites images on collision if updated .
332
328
:param dataset_id: id of a dataset
333
- :param payload: { "items": List[DatasetItem], "force ": bool }
329
+ :param payload: { "items": List[DatasetItem], "update ": bool }
334
330
:param local: flag if images are stored locally
335
331
:param batch_size: size of the batch for long payload
336
332
:return:
@@ -373,16 +369,19 @@ def populate_dataset(
373
369
async_responses : List [Any ] = []
374
370
375
371
for batch in tqdm_local_batches :
376
- payload = construct_append_payload (batch , force )
372
+ payload = construct_append_payload (batch , update )
377
373
responses = self ._process_append_requests_local (
378
- dataset_id , payload , force
374
+ dataset_id , payload , update
379
375
)
380
376
async_responses .extend (responses )
381
377
382
378
for batch in tqdm_remote_batches :
383
- payload = construct_append_payload (batch , force )
379
+ payload = construct_append_payload (batch , update )
384
380
responses = self ._process_append_requests (
385
- dataset_id , payload , force , batch_size , batch_size
381
+ dataset_id = dataset_id ,
382
+ payload = payload ,
383
+ update = update ,
384
+ batch_size = batch_size ,
386
385
)
387
386
async_responses .extend (responses )
388
387
@@ -397,20 +396,7 @@ def _process_append_requests_local(
397
396
payload : dict ,
398
397
update : bool ,
399
398
local_batch_size : int = 10 ,
400
- size : int = 10 ,
401
399
):
402
- def error (batch_items : dict ) -> UploadResponse :
403
- return UploadResponse (
404
- {
405
- DATASET_ID_KEY : dataset_id ,
406
- ERROR_ITEMS : len (batch_items ),
407
- ERROR_PAYLOAD : batch_items ,
408
- }
409
- )
410
-
411
- def exception_handler (request , exception ):
412
- logger .error (exception )
413
-
414
400
def preprocess_payload (batch ):
415
401
request_payload = [
416
402
(ITEMS_KEY , (None , json .dumps (batch ), "application/json" ))
@@ -438,21 +424,14 @@ def preprocess_payload(batch):
438
424
request_payloads .append (batch_payload )
439
425
payload_items .append (batch )
440
426
441
- async_requests = [
442
- self ._make_grequest (
427
+ responses = [
428
+ self .make_request (
443
429
payload ,
444
430
f"dataset/{ dataset_id } /append" ,
445
- local = True ,
446
431
)
447
432
for payload in request_payloads
448
433
]
449
434
450
- async_responses = grequests .map (
451
- async_requests ,
452
- exception_handler = exception_handler ,
453
- size = size ,
454
- )
455
-
456
435
def close_files (request_items ):
457
436
for item in request_items :
458
437
# file buffer in location [1][1]
@@ -463,15 +442,6 @@ def close_files(request_items):
463
442
for p in request_payloads :
464
443
close_files (p )
465
444
466
- # response object will be None if an error occurred
467
- async_responses = [
468
- response
469
- if (response and response .status_code == 200 )
470
- else error (request_items )
471
- for response , request_items in zip (async_responses , payload_items )
472
- ]
473
- responses .extend (async_responses )
474
-
475
445
return responses
476
446
477
447
def _process_append_requests (
@@ -480,49 +450,22 @@ def _process_append_requests(
480
450
payload : dict ,
481
451
update : bool ,
482
452
batch_size : int = 20 ,
483
- size : int = 10 ,
484
453
):
485
- def default_error (payload : dict ) -> UploadResponse :
486
- return UploadResponse (
487
- {
488
- DATASET_ID_KEY : dataset_id ,
489
- ERROR_ITEMS : len (payload [ITEMS_KEY ]),
490
- ERROR_PAYLOAD : payload [ITEMS_KEY ],
491
- }
492
- )
493
-
494
- def exception_handler (request , exception ):
495
- logger .error (exception )
496
-
497
454
items = payload [ITEMS_KEY ]
498
455
payloads = [
499
456
# batch_size images per request
500
457
{ITEMS_KEY : items [i : i + batch_size ], UPDATE_KEY : update }
501
458
for i in range (0 , len (items ), batch_size )
502
459
]
503
460
504
- async_requests = [
505
- self ._make_grequest (
461
+ return [
462
+ self .make_request (
506
463
payload ,
507
464
f"dataset/{ dataset_id } /append" ,
508
- local = False ,
509
465
)
510
466
for payload in payloads
511
467
]
512
468
513
- async_responses = grequests .map (
514
- async_requests , exception_handler = exception_handler , size = size
515
- )
516
-
517
- async_responses = [
518
- response
519
- if (response and response .status_code == 200 )
520
- else default_error (payload )
521
- for response , payload in zip (async_responses , payloads )
522
- ]
523
-
524
- return async_responses
525
-
526
469
def annotate_dataset (
527
470
self ,
528
471
dataset_id : str ,
@@ -1070,49 +1013,6 @@ def delete_custom_index(self, dataset_id: str):
1070
1013
requests_command = requests .delete ,
1071
1014
)
1072
1015
1073
- def _make_grequest (
1074
- self ,
1075
- payload : dict ,
1076
- route : str ,
1077
- session = None ,
1078
- requests_command : Callable = grequests .post ,
1079
- local = True ,
1080
- ):
1081
- """
1082
- makes a grequest to Nucleus endpoint
1083
- :param payload: file dict for multipart-formdata
1084
- :param route: route for the request
1085
- :param session: requests.session
1086
- :param requests_command: grequests.post, grequests.get, grequests.delete
1087
- :return: An async grequest object
1088
- """
1089
- adapter = HTTPAdapter (max_retries = Retry (total = 3 ))
1090
- sess = requests .Session ()
1091
- sess .mount ("https://" , adapter )
1092
- sess .mount ("http://" , adapter )
1093
-
1094
- endpoint = f"{ self .endpoint } /{ route } "
1095
- logger .info ("Posting to %s" , endpoint )
1096
-
1097
- if local :
1098
- post = requests_command (
1099
- endpoint ,
1100
- session = sess ,
1101
- files = payload ,
1102
- auth = (self .api_key , "" ),
1103
- timeout = DEFAULT_NETWORK_TIMEOUT_SEC ,
1104
- )
1105
- else :
1106
- post = requests_command (
1107
- endpoint ,
1108
- session = sess ,
1109
- json = payload ,
1110
- headers = {"Content-Type" : "application/json" },
1111
- auth = (self .api_key , "" ),
1112
- timeout = DEFAULT_NETWORK_TIMEOUT_SEC ,
1113
- )
1114
- return post
1115
-
1116
1016
def _make_request_raw (
1117
1017
self , payload : dict , endpoint : str , requests_command = requests .post
1118
1018
):
0 commit comments