def test_direct_s3_upload_folder(): projects_found = sa.search_projects(TEST_PROJECT_NAME2, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(TEST_PROJECT_NAME2, "a", "Vector") print(project["id"]) csv = (Path.home() / ".aws" / "credentials").read_text().splitlines() access_key_id = csv[1].split(" = ")[1] access_secret = csv[2].split(" = ")[1] sa.create_folder(project, "folder1") project_folder = project["name"] + "/folder1" sa.upload_images_from_s3_bucket_to_project(project_folder, access_key_id, access_secret, S3_BUCKET, S3_FOLDER) s3_client = boto3.client('s3') paginator = s3_client.get_paginator('list_objects_v2') response_iterator = paginator.paginate(Bucket=S3_BUCKET, Prefix=S3_FOLDER) on_s3 = [] for response in response_iterator: if 'Contents' in response: for object_data in response['Contents']: key = object_data['Key'] if key[-4:] in [".jpg", ".png"]: on_s3.append(key) assert len(on_s3) == len(sa.search_images(project_folder))
def test_preannotation_folder_upload_download_cli_pixel_object_COCO_folder( tmpdir): project_type = "Pixel" name = "Example Project folder test pixel1 preannotation cli upload coco object pixel" description = "test" from_folder = "./tests/converter_test/COCO/input/toSuperAnnotate/panoptic_segmentation" task = "panoptic_segmentation" dataset_name = "panoptic_test" projects_found = sa.search_projects(name, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(name, description, project_type) sa.create_folder(project, "folder1") project_with_folder = project["name"] + "/folder1" sa.upload_images_from_folder_to_project(project_with_folder, from_folder, annotation_status="InProgress") subprocess.run( f'superannotatecli upload-preannotations --project "{project_with_folder}" --folder "{from_folder}" --format COCO --task {task} --dataset-name {dataset_name}', check=True, shell=True) time.sleep(5) count_in = 3 images = sa.search_images(project_with_folder) for image_name in images: sa.download_image_preannotations(project_with_folder, image_name, tmpdir) count_out = len(list(Path(tmpdir).glob("*.json"))) assert count_in == count_out
def test_project_folder_image_count(tmpdir): PROJECT_NAME = "test folder image count" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') project = project["name"] sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") num_images = sa.get_project_image_count(project) assert num_images == 4 sa.create_folder(project, "folder1") sa.upload_images_from_folder_to_project(project + "/folder1", FROM_FOLDER, annotation_status="InProgress") num_images = sa.get_project_image_count(project) assert num_images == 4 num_images = sa.get_project_image_count(project + "/folder1") assert num_images == 4 num_images = sa.get_project_image_count(project, with_all_subfolders=True) assert num_images == 8
def test_copy_images3(tmpdir): PROJECT_NAME = "test copy3 folder images" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.copy_images(PROJECT_NAME, ["example_image_2.jpg", "example_image_3.jpg"], project, include_annotations=False, copy_annotation_status=False, copy_pin=False) num_images = sa.get_project_image_count(project) assert num_images == 2 num_images = sa.get_project_image_count(PROJECT_NAME) assert num_images == 4
def test_delete_folders(tmpdir): PROJECT_NAME = "test folder deletes" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") sa.create_folder(project, "folder2") sa.create_folder(project, "folder3") assert len(sa.search_folders(project)) == 3 sa.delete_folders(project, ["folder1"]) assert len(sa.search_folders(project)) == 2 sa.delete_folders(project, ["folder2", "folder3"]) assert len(sa.search_folders(project)) == 0 sa.create_folder(project, "folder5") sa.create_folder(project, "folder6") assert len(sa.search_folders(project)) == 2 sa.delete_folders(project, ["folder2", "folder5"]) assert len(sa.search_folders(project)) == 1 assert sa.search_folders(project)[0] == "folder6"
def test_move_images2(tmpdir): PROJECT_NAME = "test move folder images2" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") num_images = sa.get_project_image_count(project) assert num_images == 4 sa.create_folder(PROJECT_NAME, "folder2") project2 = PROJECT_NAME + "/folder2" num_images = sa.get_project_image_count(project2) assert num_images == 0 sa.move_images(project, None, project2) num_images = sa.get_project_image_count(project2) assert num_images == 4 num_images = sa.get_project_image_count(project) assert num_images == 0
def test_delete_images(tmpdir): PROJECT_NAME = "test delete folder images" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") project = project["name"] + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") num_images = sa.get_project_image_count(project) assert num_images == 4 sa.delete_images(project, ["example_image_2.jpg", "example_image_3.jpg"]) num_images = sa.get_project_image_count(project) assert num_images == 2 sa.delete_images(project, None) num_images = sa.get_project_image_count(project) assert num_images == 0
def test_consensus(): annot_types = ['polygon', 'bbox', 'point'] folder_names = ['consensus_1', 'consensus_2', 'consensus_3'] df_column_names = [ 'creatorEmail', 'imageName', 'instanceId', 'area', 'className', 'attributes', 'folderName', 'score' ] export_path = test_root / 'consensus_benchmark' / 'consensus_test_data' if len(sa.search_projects(project_name)) != 0: sa.delete_project(project_name) sa.create_project(project_name, "test bench", "Vector") for i in range(1, 4): sa.create_folder(project_name, "consensus_" + str(i)) sa.create_annotation_classes_from_classes_json( project_name, export_path / 'classes' / 'classes.json') sa.upload_images_from_folder_to_project(project_name, export_path / "images", annotation_status="Completed") for i in range(1, 4): sa.upload_images_from_folder_to_project(project_name + '/consensus_' + str(i), export_path / "images", annotation_status="Completed") sa.upload_annotations_from_folder_to_project(project_name, export_path) for i in range(1, 4): sa.upload_annotations_from_folder_to_project( project_name + '/consensus_' + str(i), export_path / ('consensus_' + str(i))) for annot_type in annot_types: res_df = sa.consensus(project_name, folder_names, annot_type=annot_type) #test content of projectName column assert sorted(res_df['folderName'].unique()) == folder_names #test structure of resulting DataFrame assert sorted(res_df.columns) == sorted(df_column_names) #test lower bound of the score assert (res_df['score'] >= 0).all() #test upper bound of the score assert (res_df['score'] <= 1).all() image_names = [ 'bonn_000000_000019_leftImg8bit.png', 'bielefeld_000000_000321_leftImg8bit.png' ] #test filtering images with given image names list res_images = sa.consensus(project_name, folder_names, export_root=export_path, image_list=image_names) assert sorted(res_images['imageName'].unique()) == sorted(image_names)
def create_folder(command_name, args): parser = argparse.ArgumentParser(prog=_CLI_COMMAND + " " + command_name) parser.add_argument('--project', required=True, help='Project in which to create folder') parser.add_argument('--name', required=True, help='Folder name to create') args = parser.parse_args(args) sa.create_folder(args.project, args.name)
def test_copy_images(tmpdir): PROJECT_NAME = "test copy folder images" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") num_images = sa.get_project_image_count(project) assert num_images == 4 im1 = sa.get_image_metadata(project, "example_image_2.jpg") assert im1["annotation_status"] == "InProgress" sa.create_folder(PROJECT_NAME, "folder2") project2 = PROJECT_NAME + "/folder2" num_images = sa.get_project_image_count(project2) assert num_images == 0 sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"], project2, include_annotations=False, copy_annotation_status=False, copy_pin=False) im1_copied = sa.get_image_metadata(project2, "example_image_2.jpg") assert im1_copied["annotation_status"] == "NotStarted" ann2 = sa.get_image_annotations(project2, "example_image_2.jpg") assert len(ann2["annotation_json"]["instances"]) == 0 num_images = sa.get_project_image_count(project2) assert num_images == 2 res = sa.copy_images(project, None, project2) num_images = sa.get_project_image_count(project2) assert num_images == 4 assert res == 2 sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"], PROJECT_NAME, include_annotations=False, copy_annotation_status=False, copy_pin=False) num_images = sa.get_project_image_count(PROJECT_NAME) assert num_images == 2
def test_folder_export(tmpdir): PROJECT_NAME = "test folder export" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_annotation_classes_from_classes_json( project, FROM_FOLDER / "classes" / "classes.json") sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.upload_annotations_from_folder_to_project(project, FROM_FOLDER) num_images = sa.get_project_image_count(project) assert num_images == 4 sa.create_folder(PROJECT_NAME, "folder2") project2 = PROJECT_NAME + "/folder2" num_images = sa.get_project_image_count(project2) assert num_images == 0 sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"], project2) export = sa.prepare_export(PROJECT_NAME, ["folder1", "folder2"]) sa.download_export(project, export, tmpdir) assert len(list((tmpdir / "classes").rglob("*"))) == 1 assert len(list((tmpdir / "folder1").rglob("*"))) == 4 assert len(list((tmpdir / "folder2").rglob("*"))) == 2 assert len(list((tmpdir).glob("*.*"))) == 0 export = sa.prepare_export(PROJECT_NAME) sa.download_export(project, export, tmpdir) assert len(list((tmpdir / "classes").rglob("*"))) == 1 assert len(list((tmpdir / "folder1").rglob("*"))) == 4 assert len(list((tmpdir / "folder2").rglob("*"))) == 2 assert len(list((tmpdir).glob("*.*"))) == 4
def test_assign_images_folder(tmpdir): tmpdir = Path(tmpdir) projects = sa.search_projects(PROJECT_NAME_VECTOR2, return_metadata=True) for project in projects: sa.delete_project(project) project = sa.create_project(PROJECT_NAME_VECTOR2, "test", "Vector") email = sa.get_team_metadata()["users"][0]["email"] sa.share_project(project, email, "QA") sa.create_folder(project, FOLDER2) project_folder = project["name"] + "/" + FOLDER2 sa.upload_images_from_folder_to_project(project_folder, "./tests/sample_project_vector") sa.assign_images(project_folder, ["example_image_1.jpg", "example_image_2.jpg"], email) time.sleep(1) im1_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg") im2_metadata = sa.get_image_metadata(project_folder, "example_image_2.jpg") assert im1_metadata["qa_id"] == email assert im2_metadata["qa_id"] == email sa.unshare_project(project, email) time.sleep(1) im1_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg") im2_metadata = sa.get_image_metadata(project_folder, "example_image_2.jpg") assert im1_metadata["qa_id"] is None assert im2_metadata["qa_id"] is None assert im1_metadata["annotator_id"] is None assert im2_metadata["annotator_id"] is None sa.share_project(project, email, "Annotator") sa.assign_images(project_folder, ["example_image_1.jpg", "example_image_2.jpg"], email) time.sleep(1) im1_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg") im2_metadata = sa.get_image_metadata(project_folder, "example_image_2.jpg") assert im1_metadata["annotator_id"] == email assert im2_metadata["annotator_id"] == email assert im1_metadata["qa_id"] is None assert im2_metadata["qa_id"] is None
def test_copy_images2(tmpdir): PROJECT_NAME = "test copy folder annotation images" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_annotation_classes_from_classes_json( project, FROM_FOLDER / "classes" / "classes.json") sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.upload_annotations_from_folder_to_project(project, FROM_FOLDER) num_images = sa.get_project_image_count(project) assert num_images == 4 sa.create_folder(PROJECT_NAME, "folder2") project2 = PROJECT_NAME + "/folder2" num_images = sa.get_project_image_count(project2) assert num_images == 0 sa.pin_image(project, "example_image_2.jpg") im1 = sa.get_image_metadata(project, "example_image_2.jpg") assert im1["is_pinned"] == 1 assert im1["annotation_status"] == "InProgress" sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"], project2) num_images = sa.get_project_image_count(project2) assert num_images == 2 ann1 = sa.get_image_annotations(project, "example_image_2.jpg") ann2 = sa.get_image_annotations(project2, "example_image_2.jpg") assert ann1 == ann2 im1_copied = sa.get_image_metadata(project2, "example_image_2.jpg") assert im1_copied["is_pinned"] == 1 assert im1_copied["annotation_status"] == "InProgress" im2_copied = sa.get_image_metadata(project2, "example_image_3.jpg") assert im2_copied["is_pinned"] == 0 assert im2_copied["annotation_status"] == "InProgress"
def test_folder_annotations(tmpdir): PROJECT_NAME = "test folder annotations" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') project = project["name"] sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.create_annotation_classes_from_classes_json( project, FROM_FOLDER / "classes" / "classes.json") folder_metadata = sa.create_folder(project, "folder1") assert folder_metadata["name"] == "folder1" folders = sa.search_folders(project, return_metadata=True) assert len(folders) == 1 sa.upload_images_from_folder_to_project(project + "/" + folders[0]["name"], FROM_FOLDER, annotation_status="InProgress") sa.upload_annotations_from_folder_to_project( project + "/" + folders[0]["name"], FROM_FOLDER) annot = sa.get_image_annotations(project, "example_image_1.jpg") assert len(annot["annotation_json"]["instances"]) == 0 annot = sa.get_image_annotations(project + "/folder1", "example_image_1.jpg") assert len(annot["annotation_json"]["instances"]) > 0
def test_video(tmpdir): tmpdir = Path(tmpdir) projects = sa.search_projects(PROJECT_NAME1, return_metadata=True) for project in projects: sa.delete_project(project) project = sa.create_project(PROJECT_NAME1, "test", "Vector") time.sleep(1) sa.create_annotation_class(project, "fr", "#FFAAAA") time.sleep(1) sa.create_annotation_class(project, "fr2", "#FFAACC") sa.upload_videos_from_folder_to_project( project, "./tests/sample_videos", target_fps=2 ) projects = sa.search_projects(PROJECT_NAME2, return_metadata=True) for project in projects: sa.delete_project(project) project = sa.create_project(PROJECT_NAME2, "test", "Vector") subprocess.run( f'superannotatecli upload-videos --project "{PROJECT_NAME2}" --folder ./tests/sample_videos --target-fps 2', check=True, shell=True ) time.sleep(5) sa.create_annotation_class(project, "fr2", "#FFAACC") assert len(sa.search_images(PROJECT_NAME1)) == len( sa.search_images(PROJECT_NAME2) ) sa.create_folder(project, "new folder") sa.upload_videos_from_folder_to_project( PROJECT_NAME2 + "/new folder", "./tests/sample_videos", target_fps=2 ) assert len(sa.search_images(PROJECT_NAME2 + "/new folder")) == len( sa.search_images(PROJECT_NAME2) )
def test_pin_image_in_folder(tmpdir): tmpdir = Path(tmpdir) projects = sa.search_projects(PROJECT_NAME2, return_metadata=True) for project in projects: sa.delete_project(project) project = sa.create_project(PROJECT_NAME2, "test", "Vector") sa.create_folder(project, FOLDER2) project_folder = project["name"] + "/" + FOLDER2 sa.upload_images_from_folder_to_project(project_folder, "./tests/sample_project_vector", annotation_status="QualityCheck") img_metadata0 = sa.get_image_metadata(project_folder, "example_image_1.jpg") assert img_metadata0["is_pinned"] == 0 sa.pin_image(project_folder, "example_image_1.jpg") time.sleep(1) img_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg") assert img_metadata["is_pinned"] == 1 sa.pin_image(project_folder, "example_image_1.jpg", True) time.sleep(1) img_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg") assert img_metadata["is_pinned"] == 1 sa.pin_image(project_folder, "example_image_1.jpg", False) time.sleep(1) img_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg") assert img_metadata["is_pinned"] == 0 del img_metadata["updatedAt"] del img_metadata0["updatedAt"] assert img_metadata == img_metadata0
def test_move_images(tmpdir): PROJECT_NAME = "test move folder images1" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") num_images = sa.get_project_image_count(project) assert num_images == 4 sa.create_folder(PROJECT_NAME, "folder2") project2 = PROJECT_NAME + "/folder2" num_images = sa.get_project_image_count(project2) assert num_images == 0 sa.move_images(project, ["example_image_2.jpg"], project2) num_images = sa.get_project_image_count(project2) assert num_images == 1 num_images = sa.get_project_image_count(project) assert num_images == 3 num_images = sa.get_project_image_count(PROJECT_NAME, with_all_subfolders=True) assert num_images == 4 images = sa.search_images_all_folders(PROJECT_NAME) assert images == [ "example_image_1.jpg", "example_image_2.jpg", "example_image_3.jpg", "example_image_4.jpg" ]
def test_folder_image_annotation_status(tmpdir): PROJECT_NAME = "test folder set annotation status" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_annotation_classes_from_classes_json( project, FROM_FOLDER / "classes" / "classes.json") sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.create_folder(project, "folder1") project = PROJECT_NAME + "/folder1" sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") sa.set_images_annotation_statuses( project, ["example_image_1.jpg", "example_image_2.jpg"], "QualityCheck") for image in ["example_image_1.jpg", "example_image_2.jpg"]: metadata = sa.get_image_metadata(project, image) assert metadata["annotation_status"] == "QualityCheck" for image in ["example_image_3.jpg", "example_image_3.jpg"]: metadata = sa.get_image_metadata(project, image) assert metadata["annotation_status"] == "InProgress" sa.set_images_annotation_statuses(PROJECT_NAME, None, "QualityCheck") for image in sa.search_images(PROJECT_NAME): metadata = sa.get_image_metadata(PROJECT_NAME, image) assert metadata["annotation_status"] == "QualityCheck"
def test_folder_misnamed(tmpdir): PROJECT_NAME = "test folder misnamed" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") assert "folder1" in sa.search_folders(project) sa.create_folder(project, "folder1") assert "folder1 (1)" in sa.search_folders(project) sa.create_folder(project, "folder2\\") assert "folder2_" in sa.search_folders(project)
def test_rename_folder(tmpdir): PROJECT_NAME = "test rename folder" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') sa.create_folder(project, "folder1") sa.create_folder(project, "folder2") sa.create_folder(project, "folder3") assert len(sa.search_folders(project)) == 3 sa.rename_folder(project["name"] + "/folder1", "folder5") assert len(sa.search_folders(project)) == 3 assert "folder5" in sa.search_folders(project) assert "folder1" not in sa.search_folders(project) print(sa.search_folders(project))
def test_basic_folders(tmpdir): PROJECT_NAME = "test folder simple" tmpdir = Path(tmpdir) projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True) for pr in projects_found: sa.delete_project(pr) project = sa.create_project(PROJECT_NAME, 'test', 'Vector') project = project["name"] sa.upload_images_from_folder_to_project(project, FROM_FOLDER, annotation_status="InProgress") images = sa.search_images(project, "example_image_1") assert len(images) == 1 folders = sa.search_folders(project) assert len(folders) == 0 folder_metadata = sa.create_folder(project, "folder1") assert folder_metadata["name"] == "folder1" folders = sa.search_folders(project, return_metadata=True) assert len(folders) == 1 assert folders[0]["name"] == "folder1" folders = sa.search_folders(project) assert len(folders) == 1 assert folders[0] == "folder1" images = sa.search_images(project + "/folder1", "example_image_1") assert len(images) == 0 images = sa.search_images_all_folders(project, "example_image_1") assert len(images) == 1 folder = sa.get_folder_metadata(project, "folder1") assert isinstance(folder, dict) assert folder["name"] == "folder1" with pytest.raises(SABaseException) as e: folder = sa.get_folder_metadata(project, "folder2") assert 'Folder not found' in str(e) sa.upload_images_from_folder_to_project(project + "/folder1", FROM_FOLDER, annotation_status="InProgress") images = sa.search_images(project + "/folder1", "example_image_1") assert len(images) == 1 sa.upload_images_from_folder_to_project(project + "/folder1", FROM_FOLDER, annotation_status="InProgress") images = sa.search_images(project + "/folder1") assert len(images) == 4 with pytest.raises(SABaseException) as e: sa.upload_images_from_folder_to_project(project + "/folder2", FROM_FOLDER, annotation_status="InProgress") assert 'Folder not found' in str(e) folder_metadata = sa.create_folder(project, "folder2") assert folder_metadata["name"] == "folder2" folders = sa.search_folders(project) assert len(folders) == 2 folders = sa.search_folders(project, folder_name="folder") assert len(folders) == 2 folders = sa.search_folders(project, folder_name="folder2") assert len(folders) == 1 assert folders[0] == "folder2" folders = sa.search_folders(project, folder_name="folder1") assert len(folders) == 1 assert folders[0] == "folder1" folders = sa.search_folders(project, folder_name="old") assert len(folders) == 2