Skip to content

Commit bc4248d

Browse files
authored
Merge pull request #165 from superannotateai/re-design-sdk
Interface fix
2 parents fa9e4fc + bb4ece2 commit bc4248d

27 files changed

+162
-88
lines changed

src/superannotate/lib/app/interface/cli_interface.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import logging
44
import os
5+
import sys
56
import tempfile
67
import uuid
78
from collections import Counter
@@ -42,6 +43,7 @@ def version():
4243
) as f:
4344
version = f.read().rstrip()[15:-1]
4445
print(version)
46+
sys.exit(0)
4547

4648
@staticmethod
4749
def init():
@@ -64,8 +66,9 @@ def init():
6466
print("Configuration file successfully updated.")
6567
else:
6668
print("Configuration file successfully created.")
69+
sys.exit(0)
6770

68-
def create_project(self, name: str, description: str, type: str) -> dict:
71+
def create_project(self, name: str, description: str, type: str):
6972
"""
7073
To create a new project
7174
"""
@@ -74,14 +77,14 @@ def create_project(self, name: str, description: str, type: str) -> dict:
7477
return response.errors
7578
return response.data
7679

77-
def create_folder(self, project: str, name: str) -> dict:
80+
def create_folder(self, project: str, name: str):
7881
"""
7982
To create a new folder
8083
"""
8184
response = self.controller.create_folder(project=project, folder_name=name)
8285
if response.errors:
83-
return response.errors
84-
return response.data
86+
logger.critical(response.errors)
87+
sys.exit(0)
8588

8689
def upload_images(
8790
self,
@@ -168,6 +171,7 @@ def upload_image(image_path: str):
168171
images=uploaded_image_entities[i : i + 500], # noqa: E203
169172
annotation_status=set_annotation_status,
170173
)
174+
sys.exit(0)
171175

172176
def export_project(
173177
self,
@@ -192,6 +196,7 @@ def export_project(
192196
extract_zip_contents=not disable_extract_zip_contents,
193197
to_s3_bucket=False,
194198
)
199+
sys.exit(0)
195200

196201
def upload_preannotations(
197202
self, project, folder, data_set_name=None, task=None, format=None
@@ -213,6 +218,7 @@ def upload_preannotations(
213218
task=task,
214219
pre=True,
215220
)
221+
sys.exit(0)
216222

217223
def upload_annotations(
218224
self, project, folder, data_set_name=None, task=None, format=None
@@ -234,6 +240,7 @@ def upload_annotations(
234240
task=task,
235241
pre=False,
236242
)
243+
sys.exit(0)
237244

238245
def _upload_annotations(
239246
self, project, folder, format, data_set_name, task, pre=True
@@ -281,6 +288,7 @@ def _upload_annotations(
281288
if response.errors:
282289
logger.warning(response.errors)
283290
progress_bar.update()
291+
sys.exit(0)
284292

285293
def attach_image_urls(
286294
self, project: str, attachments: str, annotation_status: Optional[Any] = None
@@ -289,11 +297,13 @@ def attach_image_urls(
289297
To attach image URLs to project use:
290298
"""
291299
self._attach_urls(project, attachments, annotation_status)
300+
sys.exit(0)
292301

293302
def attach_video_urls(
294303
self, project: str, attachments: str, annotation_status: Optional[Any] = None
295304
):
296305
self._attach_urls(project, attachments, annotation_status)
306+
sys.exit(0)
297307

298308
def _attach_urls(
299309
self, project: str, attachments: str, annotation_status: Optional[Any] = None
@@ -407,3 +417,4 @@ def _upload_image(image_path: str) -> str:
407417
images=uploaded_image_entities[i : i + 500], # noqa: E203
408418
annotation_status=set_annotation_status,
409419
)
420+
sys.exit(0)

src/superannotate/lib/app/interface/sdk_interface.py

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,9 @@ def create_project_from_metadata(project_metadata):
187187
:rtype: dict
188188
"""
189189
response = controller.create_project(
190-
name=project_metadata["project"]["name"],
191-
description=project_metadata["project"]["description"],
192-
project_type=project_metadata["project"]["type"],
190+
name=project_metadata["name"],
191+
description=project_metadata["description"],
192+
project_type=project_metadata["type"],
193193
contributors=project_metadata.get("contributors", []),
194194
settings=project_metadata.get("settings", []),
195195
annotation_classes=project_metadata.get("classes", []),
@@ -305,7 +305,7 @@ def create_folder(project, folder_name):
305305
logger.info(f"Folder {folder_name} created in project {project}")
306306
return folder.to_dict()
307307
if res.errors:
308-
logger.warning(res.errors)
308+
raise AppException(res.errors)
309309

310310

311311
@Trackable
@@ -361,7 +361,9 @@ def delete_folders(project, folder_names):
361361
:type folder_names: list of strs
362362
"""
363363

364-
controller.delete_folders(project_name=project, folder_names=folder_names)
364+
res = controller.delete_folders(project_name=project, folder_names=folder_names)
365+
if res.errors:
366+
raise AppException(res.errors)
365367
logger.info(f"Folders {folder_names} deleted in project {project}")
366368

367369

@@ -396,7 +398,9 @@ def rename_folder(project, new_folder_name):
396398
:type new_folder_name: str
397399
"""
398400
project_name, folder_name = extract_project_folder(project)
399-
controller.update_folder(project_name, folder_name, {"name": new_folder_name})
401+
res = controller.update_folder(project_name, folder_name, {"name": new_folder_name})
402+
if res.errors:
403+
raise AppException(res.errors)
400404
logger.info(
401405
f"Folder {folder_name} renamed to {new_folder_name} in project {project_name}"
402406
)
@@ -793,23 +797,24 @@ def get_project_metadata(
793797
:rtype: dict
794798
"""
795799
project_name, folder_name = extract_project_folder(project)
796-
metadata = controller.get_project_metadata(
800+
response = controller.get_project_metadata(
797801
project_name,
798802
include_annotation_classes,
799803
include_settings,
800804
include_workflow,
801805
include_contributors,
802806
include_complete_image_count,
803-
)
804-
metadata = metadata.data
805-
for elem in "settings", "classes", "workflow":
806-
if metadata.get(elem):
807+
).data
808+
809+
metadata = ProjectSerializer(response["project"]).serialize()
810+
811+
for elem in "settings", "classes", "workflows", "contributors":
812+
if response.get(elem):
807813
metadata[elem] = [
808-
BaseSerializers(attribute).serialize() for attribute in metadata[elem]
814+
BaseSerializers(attribute).serialize() for attribute in response[elem]
809815
]
810-
811-
if metadata.get("project"):
812-
metadata["project"] = ProjectSerializer(metadata["project"]).serialize()
816+
else:
817+
metadata[elem] = []
813818
return metadata
814819

815820

@@ -899,7 +904,7 @@ def get_project_default_image_quality_in_editor(project):
899904
:rtype: str
900905
"""
901906
project_name, folder_name = extract_project_folder(project)
902-
settings = controller.get_project_settings(project_name)
907+
settings = controller.get_project_settings(project_name).data
903908
for setting in settings:
904909
if setting.attribute == "ImageQuality":
905910
return setting.value
@@ -2343,22 +2348,20 @@ def upload_annotations_from_folder_to_project(
23432348
failed_annotations = []
23442349
missing_annotations = []
23452350
chunk_size = 10
2346-
with tqdm(total=len(annotation_paths)) as progress_bar:
2347-
for i in range(0, len(annotation_paths), chunk_size):
2348-
response = controller.upload_annotations_from_folder(
2349-
project_name=project_name,
2350-
folder_name=folder_name,
2351-
folder_path=folder_path,
2352-
annotation_paths=annotation_paths[i : i + chunk_size], # noqa: E203
2353-
client_s3_bucket=from_s3_bucket,
2354-
)
2355-
if response.errors:
2356-
logger.warning(response.errors)
2357-
if response.data:
2358-
uploaded_annotations.extend(response.data[0])
2359-
missing_annotations.extend(response.data[1])
2360-
failed_annotations.extend(response.data[2])
2361-
progress_bar.update(chunk_size)
2351+
for i in tqdm(range(0, len(annotation_paths), chunk_size)):
2352+
response = controller.upload_annotations_from_folder(
2353+
project_name=project_name,
2354+
folder_name=folder_name,
2355+
folder_path=folder_path,
2356+
annotation_paths=annotation_paths[i : i + chunk_size], # noqa: E203
2357+
client_s3_bucket=from_s3_bucket,
2358+
)
2359+
if response.errors:
2360+
logger.warning(response.errors)
2361+
if response.data:
2362+
uploaded_annotations.extend(response.data[0])
2363+
missing_annotations.extend(response.data[1])
2364+
failed_annotations.extend(response.data[2])
23622365
return uploaded_annotations, failed_annotations, missing_annotations
23632366

23642367

src/superannotate/lib/app/serializers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def __init__(self, entity: BaseEntity):
1010
self._entity = entity
1111

1212
def serialize(self):
13+
if isinstance(self._entity, dict):
14+
return self._entity
1315
return self._entity.to_dict()
1416

1517

src/superannotate/lib/core/enums.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ class ExportStatus(BaseTitledEnum):
5959
class AnnotationStatus(BaseTitledEnum):
6060
NOT_STARTED = "NotStarted", 1
6161
IN_PROGRESS = "InProgress", 2
62-
COMPLETED = "Completed", 3
63-
QUALITY_CHECK = "QualityCheck", 4
64-
RETURNED = "Returned", 5
62+
QUALITY_CHECK = "QualityCheck", 3
63+
RETURNED = "Returned", 4
64+
COMPLETED = "Completed", 5
6565
SKIPPED = "Skipped", 6
6666

6767

src/superannotate/lib/core/repositories.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ def update(self, entity: BaseEntity) -> BaseEntity:
3838
def delete(self, uuid: Any):
3939
raise NotImplementedError
4040

41+
def bulk_delete(self, entities: List[BaseEntity]) -> bool:
42+
raise NotImplementedError
43+
4144
@staticmethod
4245
def _drop_nones(data: dict):
4346
for k, v in list(data.items()):

src/superannotate/lib/core/response.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def status(self, value):
2525

2626
@property
2727
def errors(self):
28-
return self._errors
28+
return "\n".join([error.message for error in self._errors])
2929

3030
@errors.setter
3131
def errors(self, error: list):

0 commit comments

Comments
 (0)