Skip to content

Commit fb6b8ed

Browse files
committed
Code cleanup
1 parent fe49c9a commit fb6b8ed

File tree

6 files changed

+120
-137
lines changed

6 files changed

+120
-137
lines changed

superannotate/__init__.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ def consensus(*args, **kwargs):
3838
delete_annotation_class, download_annotation_classes_json,
3939
get_annotation_class_metadata, search_annotation_classes
4040
)
41-
from .db.clone_project import clone_project
4241
from .db.exports import (
4342
download_export, get_export_metadata, get_exports, prepare_export
4443
)
@@ -61,13 +60,12 @@ def consensus(*args, **kwargs):
6160
assign_images, copy_image, copy_images, delete_images, move_image,
6261
move_images, pin_image, upload_image_to_project
6362
)
64-
from .db.project_metadata import get_project_metadata
6563
from .db.projects import (
66-
create_project, create_project_from_metadata, delete_project,
64+
clone_project, create_project, create_project_from_metadata, delete_project,
6765
get_project_default_image_quality_in_editor, get_project_image_count,
68-
get_project_settings, get_project_workflow, rename_project,
69-
set_project_default_image_quality_in_editor, set_project_settings,
70-
set_project_workflow, share_project, unshare_project,
66+
get_project_metadata, get_project_settings, get_project_workflow,
67+
rename_project, set_project_default_image_quality_in_editor,
68+
set_project_settings, set_project_workflow, share_project, unshare_project,
7169
upload_annotations_from_folder_to_project,
7270
upload_images_from_azure_blob_to_project,
7371
upload_images_from_folder_to_project,

superannotate/db/clone_project.py

Lines changed: 0 additions & 61 deletions
This file was deleted.

superannotate/db/images.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
)
2020
from ..api import API
2121
from ..exceptions import SABaseException
22-
from ..parameter_decorators import project_metadata
2322
from .annotation_classes import (
2423
fill_class_and_attribute_ids, fill_class_and_attribute_names,
2524
get_annotation_classes_id_to_name, get_annotation_classes_name_to_id,

superannotate/db/project_metadata.py

Lines changed: 0 additions & 55 deletions
This file was deleted.

superannotate/db/projects.py

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
)
3636
from .images import get_image_metadata, search_images
3737
from .project_api import (
38-
get_project_and_folder_metadata, get_project_metadata_bare
38+
get_project_and_folder_metadata, get_project_metadata_bare,
39+
get_project_metadata_with_users
3940
)
4041
from .users import get_team_contributor_metadata
4142

@@ -1962,3 +1963,98 @@ def get_project_default_image_quality_in_editor(project):
19621963
0,
19631964
"Image quality in editor should be 'compressed', 'original' or None for project settings value"
19641965
)
1966+
1967+
1968+
def get_project_metadata(
1969+
project,
1970+
include_annotation_classes=False,
1971+
include_settings=False,
1972+
include_workflow=False,
1973+
include_contributors=False,
1974+
include_complete_image_count=False
1975+
):
1976+
"""Returns project metadata
1977+
1978+
:param project: project name or project metadata from previous calls
1979+
:type project: str or dict
1980+
:param include_annotation_classes: enables project annotation classes output under
1981+
the key "annotation_classes"
1982+
:type include_annotation_classes: bool
1983+
:param include_settings: enables project settings output under
1984+
the key "settings"
1985+
:type include_settings: bool
1986+
:param include_workflow: enables project workflow output under
1987+
the key "workflow"
1988+
:type include_workflow: bool
1989+
:param include_contributors: enables project contributors output under
1990+
the key "contributors"
1991+
:type include_contributors: bool
1992+
1993+
:return: metadata of project
1994+
:rtype: dict
1995+
"""
1996+
if not isinstance(project, dict):
1997+
project = get_project_metadata_bare(
1998+
project, include_complete_image_count
1999+
)
2000+
result = copy.deepcopy(project)
2001+
if include_annotation_classes:
2002+
result["annotation_classes"] = search_annotation_classes(project)
2003+
if include_contributors:
2004+
result["contributors"] = get_project_metadata_with_users(project
2005+
)["users"]
2006+
if include_settings:
2007+
result["settings"] = get_project_settings(project)
2008+
if include_workflow:
2009+
result["workflow"] = get_project_workflow(project)
2010+
return result
2011+
2012+
2013+
def clone_project(
2014+
project_name,
2015+
from_project,
2016+
project_description=None,
2017+
copy_annotation_classes=True,
2018+
copy_settings=True,
2019+
copy_workflow=True,
2020+
copy_contributors=False
2021+
):
2022+
"""Create a new project in the team using annotation classes and settings from from_project.
2023+
2024+
:param project_name: new project's name
2025+
:type project_name: str
2026+
:param from_project: the name of the project being used for duplication
2027+
:type from_project: str
2028+
:param project_description: the new project's description. If None, from_project's
2029+
description will be used
2030+
:type project_description: str
2031+
:param copy_annotation_classes: enables copying annotation classes
2032+
:type copy_annotation_classes: bool
2033+
:param copy_settings: enables copying project settings
2034+
:type copy_settings: bool
2035+
:param copy_workflow: enables copying project workflow
2036+
:type copy_workflow: bool
2037+
:param copy_contributors: enables copying project contributors
2038+
:type copy_contributors: bool
2039+
2040+
:return: dict object metadata of the new project
2041+
:rtype: dict
2042+
"""
2043+
try:
2044+
get_project_metadata_bare(project_name)
2045+
except SANonExistingProjectNameException:
2046+
pass
2047+
else:
2048+
raise SAExistingProjectNameException(
2049+
0, "Project with name " + project_name +
2050+
" already exists. Please use unique names for projects to use with SDK."
2051+
)
2052+
metadata = get_project_metadata(
2053+
from_project, copy_annotation_classes, copy_settings, copy_workflow,
2054+
copy_contributors
2055+
)
2056+
metadata["name"] = project_name
2057+
if project_description is not None:
2058+
metadata["description"] = project_description
2059+
2060+
return create_project_from_metadata(metadata)

tests/test_ml_funcs.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
from .common import upload_project
99

1010
PROJECT_NAME_VECTOR = 'ML Functionality Test Vector'
11-
PROJECT_NAME_PIXEL = 'ML Functionality Test Pixel'
11+
PROJECT_NAME_PIXEL_PREDICTION = 'ML Functionality Test Pixel Prediction'
12+
PROJECT_NAME_PIXEL_SEGMENTATION = 'ML Functionality Test Pixel Segmentation'
1213
PROJECT_DESCRIPTION = 'testing ml functionality through SDK'
1314
PROJECT_PATH_PIXEL = "./tests/sample_project_pixel_for_ml_functionality"
1415
PROJECT_PATH_VECTOR = "./tests/sample_project_vector_for_ml_functionality"
@@ -28,7 +29,7 @@ def test_run_prediction():
2829
)
2930

3031
upload_project(
31-
Path(PROJECT_PATH_PIXEL), PROJECT_NAME_PIXEL,
32+
Path(PROJECT_PATH_PIXEL), PROJECT_NAME_PIXEL_PREDICTION,
3233
"Test for ml functionality", "Pixel"
3334
)
3435

@@ -42,15 +43,15 @@ def test_run_prediction():
4243
#Tests that the argument 'project' is valid
4344
with pytest.raises(SABaseException) as e:
4445
sa.run_prediction(
45-
[PROJECT_NAME_VECTOR, PROJECT_NAME_PIXEL], ["DoesntMatter.jpg"],
46-
MODEL_NAME
46+
[PROJECT_NAME_VECTOR, PROJECT_NAME_PIXEL_PREDICTION],
47+
["DoesntMatter.jpg"], MODEL_NAME
4748
)
4849
assert str(
4950
e
5051
) == "smart prediction cannot be run on images from different projects simultaneously"
5152

5253
#Tests if prediction on all available images gets run
53-
image_names_pixel = sa.search_images(PROJECT_NAME_PIXEL)
54+
image_names_pixel = sa.search_images(PROJECT_NAME_PIXEL_PREDICTION)
5455
image_names_vector = sa.search_images(PROJECT_NAME_VECTOR)
5556

5657
succeded_imgs, failed_imgs = sa.run_prediction(
@@ -59,12 +60,13 @@ def test_run_prediction():
5960
assert (len(succeded_imgs) + len(failed_imgs)) == 4
6061

6162
succeded_imgs, failed_imgs = sa.run_prediction(
62-
PROJECT_NAME_PIXEL, image_names_pixel[:4], MODEL_NAME
63+
PROJECT_NAME_PIXEL_PREDICTION, image_names_pixel[:4], MODEL_NAME
6364
)
6465
assert (len(succeded_imgs) + len(failed_imgs)) == 4
6566

6667
succeded_imgs, failed_imgs = sa.run_prediction(
67-
PROJECT_NAME_PIXEL, image_names_pixel[:4] + ["NA.jpg"], MODEL_NAME
68+
PROJECT_NAME_PIXEL_PREDICTION, image_names_pixel[:4] + ["NA.jpg"],
69+
MODEL_NAME
6870
)
6971
assert (len(succeded_imgs) + len(failed_imgs)) == 4
7072

@@ -84,35 +86,39 @@ def test_run_segmentation():
8486
model_generic = 'generic'
8587

8688
upload_project(
87-
Path(PROJECT_PATH_PIXEL), PROJECT_NAME_PIXEL,
89+
Path(PROJECT_PATH_PIXEL), PROJECT_NAME_PIXEL_SEGMENTATION,
8890
"Test for ml functionality", "Pixel"
8991
)
9092

91-
image_names_pixel = sa.search_images(PROJECT_NAME_PIXEL)
93+
image_names_pixel = sa.search_images(PROJECT_NAME_PIXEL_SEGMENTATION)
9294
with pytest.raises(SABaseException) as e:
9395
res = sa.run_segmentation(
9496
PROJECT_NAME_VECTOR, image_names_pixel, model_auto
9597
)
9698
assert str(e) == "Operation not supported for given project type"
9799
with pytest.raises(SABaseException) as e:
98100
sa.run_segmentation(
99-
PROJECT_NAME_PIXEL, image_names_pixel[:2], "NonExistantModel"
101+
PROJECT_NAME_PIXEL_SEGMENTATION, image_names_pixel[:2],
102+
"NonExistantModel"
100103
)
101104
assert str(e) == "Model Does not exist"
102105

103106
with pytest.raises(SABaseException) as e:
104107
sa.run_segmentation(
105-
PROJECT_NAME_PIXEL, ["NonExistantImage.jpg"], MODEL_NAME
108+
PROJECT_NAME_PIXEL_SEGMENTATION, ["NonExistantImage.jpg"],
109+
MODEL_NAME
106110
)
107111
assert str(e) == "No valid image names were provided"
108112

109113
succeded_imgs, failed_imgs = sa.run_segmentation(
110-
PROJECT_NAME_PIXEL, image_names_pixel[:4] + ["NA.jpg"], model_generic
114+
PROJECT_NAME_PIXEL_SEGMENTATION, image_names_pixel[:4] + ["NA.jpg"],
115+
model_generic
111116
)
112117
assert (len(succeded_imgs) + len(failed_imgs)) == 4
113118

114119
succeded_imgs, failed_imgs = sa.run_segmentation(
115-
PROJECT_NAME_PIXEL, image_names_pixel[:4] + ["NA.jpg"], model_auto
120+
PROJECT_NAME_PIXEL_SEGMENTATION, image_names_pixel[:4] + ["NA.jpg"],
121+
model_auto
116122
)
117123

118124
assert (len(succeded_imgs) + len(failed_imgs)) == 4

0 commit comments

Comments
 (0)