diff --git a/pyproject.toml b/pyproject.toml index fbd469f7..92db0734 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -151,6 +151,7 @@ lint.select = [ "E", # pycodestyle errors - https://docs.astral.sh/ruff/rules/#error-e "F", # Pyflakes - https://docs.astral.sh/ruff/rules/#pyflakes-f "I", # isort - https://docs.astral.sh/ruff/rules/#isort-i + "PT", # pytest - https://docs.astral.sh/ruff/rules/#flake8-pytest-style-pt "Q", # flake8-quotes - https://docs.astral.sh/ruff/rules/#flake8-quotes-q "RUF", # Ruff-specific rules - https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf "S", # bandit - https://docs.astral.sh/ruff/rules/#flake8-bandit-s @@ -163,7 +164,8 @@ lint.per-file-ignores."supervision/**" = [ "S101", # TODO: Replace asserts with proper error handling ] lint.per-file-ignores."test/**" = [ - "S101", # Use of `assert` detected + "PT011", # TODO: `pytest.raises(Exception)` is too broad, set the `match` parameter or use a more specific exception + "S101", # Use of `assert` detected ] lint.unfixable = [ ] # Allow unused variables when underscore-prefixed. diff --git a/supervision/detection/vlm.py b/supervision/detection/vlm.py index 97988c9f..814e417c 100644 --- a/supervision/detection/vlm.py +++ b/supervision/detection/vlm.py @@ -575,7 +575,7 @@ def from_florence_2( labels = np.array([result_string]) return xyxy, labels, None, None - assert False, f"Unimplemented task: {task}" + raise RuntimeError(f"Unimplemented task: {task}") def from_google_gemini_2_0( diff --git a/test/annotators/test_utils.py b/test/annotators/test_utils.py index 3ab0f9b9..6b48d935 100644 --- a/test/annotators/test_utils.py +++ b/test/annotators/test_utils.py @@ -11,7 +11,7 @@ from test.test_utils import mock_detections @pytest.mark.parametrize( - "detections, detection_idx, color_lookup, expected_result, exception", + ("detections", "detection_idx", "color_lookup", "expected_result", "exception"), [ ( mock_detections( @@ -111,7 +111,7 @@ def test_resolve_color_idx( @pytest.mark.parametrize( - "text, max_line_length, expected_result, exception", + ("text", "max_line_length", "expected_result", "exception"), [ (None, None, [""], DoesNotRaise()), # text is None ("", None, [""], DoesNotRaise()), # empty string diff --git a/test/classification/test_core.py b/test/classification/test_core.py index 958ed901..d1dd9d35 100644 --- a/test/classification/test_core.py +++ b/test/classification/test_core.py @@ -9,7 +9,7 @@ from supervision.classification.core import Classifications @pytest.mark.parametrize( - "class_id, confidence, k, expected_result, exception", + ("class_id", "confidence", "k", "expected_result", "exception"), [ ( np.array([0, 1, 2, 3, 4]), diff --git a/test/dataset/formats/test_coco.py b/test/dataset/formats/test_coco.py index bde8566c..ac76d634 100644 --- a/test/dataset/formats/test_coco.py +++ b/test/dataset/formats/test_coco.py @@ -39,7 +39,7 @@ def mock_coco_annotation( @pytest.mark.parametrize( - "coco_categories, expected_result, exception", + ("coco_categories", "expected_result", "exception"), [ ([], [], DoesNotRaise()), # empty coco categories ( @@ -87,7 +87,7 @@ def test_coco_categories_to_classes( @pytest.mark.parametrize( - "classes, exception", + ("classes", "exception"), [ ([], DoesNotRaise()), # empty classes (["baseball cap"], DoesNotRaise()), # single class @@ -104,7 +104,7 @@ def test_classes_to_coco_categories_and_back_to_classes( @pytest.mark.parametrize( - "coco_annotations, expected_result, exception", + ("coco_annotations", "expected_result", "exception"), [ ([], {}, DoesNotRaise()), # empty coco annotations ( @@ -163,8 +163,14 @@ def test_group_coco_annotations_by_image_id( @pytest.mark.parametrize( - "image_annotations, resolution_wh, with_masks, use_iscrowd, " - "expected_result, exception", + ( + "image_annotations", + "resolution_wh", + "with_masks", + "use_iscrowd", + "expected_result", + "exception", + ), [ ( [], @@ -601,7 +607,7 @@ def test_coco_annotations_to_detections( @pytest.mark.parametrize( - "coco_categories, target_classes, expected_result, exception", + ("coco_categories", "target_classes", "expected_result", "exception"), [ ([], [], {}, DoesNotRaise()), # empty coco categories ( @@ -660,7 +666,7 @@ def test_build_coco_class_index_mapping( @pytest.mark.parametrize( - "detections, image_id, annotation_id, expected_result, exception", + ("detections", "image_id", "annotation_id", "expected_result", "exception"), [ ( Detections( diff --git a/test/dataset/formats/test_pascal_voc.py b/test/dataset/formats/test_pascal_voc.py index 27600c50..c93e506f 100644 --- a/test/dataset/formats/test_pascal_voc.py +++ b/test/dataset/formats/test_pascal_voc.py @@ -31,7 +31,7 @@ def are_xml_elements_equal(elem1, elem2): @pytest.mark.parametrize( - "xyxy, name, polygon, expected_result, exception", + ("xyxy", "name", "polygon", "expected_result", "exception"), [ ( np.array([0, 0, 10, 10]), @@ -71,7 +71,7 @@ def test_object_to_pascal_voc( @pytest.mark.parametrize( - "polygon_element, expected_result, exception", + ("polygon_element", "expected_result", "exception"), [ ( ElementTree.fromstring( @@ -116,7 +116,14 @@ NO_DETECTIONS = """""" @pytest.mark.parametrize( - "xml_string, classes, resolution_wh, force_masks, expected_result, exception", + ( + "xml_string", + "classes", + "resolution_wh", + "force_masks", + "expected_result", + "exception", + ), [ ( ONE_CLASS_ONE_BBOX, diff --git a/test/dataset/formats/test_yolo.py b/test/dataset/formats/test_yolo.py index 4b032603..f54f8a80 100644 --- a/test/dataset/formats/test_yolo.py +++ b/test/dataset/formats/test_yolo.py @@ -31,7 +31,7 @@ def _arrays_almost_equal( @pytest.mark.parametrize( - "lines, expected_result, exception", + ("lines", "expected_result", "exception"), [ ([], False, DoesNotRaise()), # empty yolo annotation file ( @@ -44,7 +44,6 @@ def _arrays_almost_equal( False, DoesNotRaise(), ), # yolo annotation file with two lines with box - (["0 0.5 0.5 0.2 0.2"], False, DoesNotRaise()), ( ["0 0.4 0.4 0.6 0.4 0.6 0.6 0.4 0.6"], True, @@ -66,7 +65,7 @@ def test_with_mask( @pytest.mark.parametrize( - "lines, resolution_wh, with_masks, expected_result, exception", + ("lines", "resolution_wh", "with_masks", "expected_result", "exception"), [ ( [], @@ -190,7 +189,7 @@ def test_yolo_annotations_to_detections( @pytest.mark.parametrize( - "image_name, expected_result, exception", + ("image_name", "expected_result", "exception"), [ ("image.png", "image.txt", DoesNotRaise()), # simple png image ("image.jpeg", "image.txt", DoesNotRaise()), # simple jpeg image @@ -211,7 +210,7 @@ def test_image_name_to_annotation_name( @pytest.mark.parametrize( - "xyxy, class_id, image_shape, polygon, expected_result, exception", + ("xyxy", "class_id", "image_shape", "polygon", "expected_result", "exception"), [ ( np.array([100, 100, 200, 200], dtype=np.float32), diff --git a/test/dataset/test_core.py b/test/dataset/test_core.py index 5ad3a3ef..edfda4be 100644 --- a/test/dataset/test_core.py +++ b/test/dataset/test_core.py @@ -9,7 +9,7 @@ from test.test_utils import mock_detections @pytest.mark.parametrize( - "dataset_list, expected_result, exception", + ("dataset_list", "expected_result", "exception"), [ ( [], diff --git a/test/dataset/test_utils.py b/test/dataset/test_utils.py index 0b5a79f2..a9c7ba34 100644 --- a/test/dataset/test_utils.py +++ b/test/dataset/test_utils.py @@ -22,7 +22,7 @@ T = TypeVar("T") @pytest.mark.parametrize( - "data, train_ratio, random_state, shuffle, expected_result, exception", + ("data", "train_ratio", "random_state", "shuffle", "expected_result", "exception"), [ ([], 0.5, None, False, ([], []), DoesNotRaise()), # empty data ( @@ -94,7 +94,7 @@ def test_train_test_split( @pytest.mark.parametrize( - "class_lists, expected_result, exception", + ("class_lists", "expected_result", "exception"), [ ([], [], DoesNotRaise()), # empty class lists ( @@ -128,7 +128,7 @@ def test_merge_class_maps( @pytest.mark.parametrize( - "source_classes, target_classes, expected_result, exception", + ("source_classes", "target_classes", "expected_result", "exception"), [ ([], [], {}, DoesNotRaise()), # empty class lists ([], ["dog", "person"], {}, DoesNotRaise()), # empty source class list @@ -178,7 +178,7 @@ def test_build_class_index_mapping( @pytest.mark.parametrize( - "source_to_target_mapping, detections, expected_result, exception", + ("source_to_target_mapping", "detections", "expected_result", "exception"), [ ( {}, @@ -238,7 +238,7 @@ def test_map_detections_class_id( @pytest.mark.parametrize( - "mask, expected_rle, exception", + ("mask", "expected_rle", "exception"), [ ( np.zeros((3, 3)).astype(bool), @@ -297,7 +297,7 @@ def test_mask_to_rle( @pytest.mark.parametrize( - "rle, resolution_wh, expected_mask, exception", + ("rle", "resolution_wh", "expected_mask", "exception"), [ ( np.array([9]), diff --git a/test/detection/test_core.py b/test/detection/test_core.py index c57bea40..1cd2bfde 100644 --- a/test/detection/test_core.py +++ b/test/detection/test_core.py @@ -130,7 +130,7 @@ TEST_DET_DIFFERENT_METADATA = Detections( @pytest.mark.parametrize( - "detections, index, expected_result, exception", + ("detections", "index", "expected_result", "exception"), [ ( DETECTIONS, @@ -244,7 +244,7 @@ def test_getitem( @pytest.mark.parametrize( - "detections_list, expected_result, exception", + ("detections_list", "expected_result", "exception"), [ ([], Detections.empty(), DoesNotRaise()), # empty detections list ( @@ -516,7 +516,7 @@ def test_merge( @pytest.mark.parametrize( - "detections, anchor, expected_result, exception", + ("detections", "anchor", "expected_result", "exception"), [ ( Detections.empty(), @@ -598,7 +598,7 @@ def test_get_anchor_coordinates( @pytest.mark.parametrize( - "detections_a, detections_b, expected_result", + ("detections_a", "detections_b", "expected_result"), [ ( Detections.empty(), @@ -649,7 +649,7 @@ def test_equal( @pytest.mark.parametrize( - "detection_1, detection_2, expected_result, exception", + ("detection_1", "detection_2", "expected_result", "exception"), [ ( mock_detections( diff --git a/test/detection/test_csv.py b/test/detection/test_csv.py index bad4b8a1..a2b464f3 100644 --- a/test/detection/test_csv.py +++ b/test/detection/test_csv.py @@ -9,9 +9,14 @@ from test.test_utils import mock_detections @pytest.mark.parametrize( - "detections, custom_data, " - "second_detections, second_custom_data, " - "file_name, expected_result", + ( + "detections", + "custom_data", + "second_detections", + "second_custom_data", + "file_name", + "expected_result", + ), [ ( mock_detections( @@ -206,9 +211,14 @@ def test_csv_sink( @pytest.mark.parametrize( - "detections, custom_data, " - "second_detections, second_custom_data, " - "file_name, expected_result", + ( + "detections", + "custom_data", + "second_detections", + "second_custom_data", + "file_name", + "expected_result", + ), [ ( mock_detections( diff --git a/test/detection/test_json.py b/test/detection/test_json.py index 4dd422e1..b9c54f0f 100644 --- a/test/detection/test_json.py +++ b/test/detection/test_json.py @@ -9,9 +9,14 @@ from test.test_utils import mock_detections @pytest.mark.parametrize( - "detections, custom_data, " - "second_detections, second_custom_data, " - "file_name, expected_result", + ( + "detections", + "custom_data", + "second_detections", + "second_custom_data", + "file_name", + "expected_result", + ), [ ( mock_detections( diff --git a/test/detection/test_line_counter.py b/test/detection/test_line_counter.py index f7227fa6..12c50c5e 100644 --- a/test/detection/test_line_counter.py +++ b/test/detection/test_line_counter.py @@ -10,7 +10,7 @@ from test.test_utils import mock_detections @pytest.mark.parametrize( - "vector, expected_result, exception", + ("vector", "expected_result", "exception"), [ ( Vector(start=Point(x=0.0, y=0.0), end=Point(x=0.0, y=0.0)), @@ -75,7 +75,7 @@ def test_calculate_region_of_interest_limits( @pytest.mark.parametrize( - "vector, xyxy_sequence, expected_crossed_in, expected_crossed_out", + ("vector", "xyxy_sequence", "expected_crossed_in", "expected_crossed_out"), [ ( # Vertical line, simple crossing Vector(Point(0, 0), Point(0, 10)), @@ -260,8 +260,13 @@ def test_line_zone_one_detection_default_anchors( @pytest.mark.parametrize( - "vector, xyxy_sequence, triggering_anchors, expected_crossed_in, " - "expected_crossed_out", + ( + "vector", + "xyxy_sequence", + "triggering_anchors", + "expected_crossed_in", + "expected_crossed_out", + ), [ ( # Scrape line, left side, corner anchors Vector(Point(0, 0), Point(10, 0)), @@ -425,8 +430,14 @@ def test_line_zone_one_detection( @pytest.mark.parametrize( - "vector, xyxy_sequence, anchors, expected_crossed_in, " - "expected_crossed_out, exception", + ( + "vector", + "xyxy_sequence", + "anchors", + "expected_crossed_in", + "expected_crossed_out", + "exception", + ), [ ( # One stays, one crosses Vector(Point(0, 0), Point(10, 0)), @@ -494,8 +505,14 @@ def test_line_zone_multiple_detections( @pytest.mark.parametrize( - "vector, xyxy_sequence, triggering_anchors, minimum_crossing_threshold, " - "expected_crossed_in, expected_crossed_out", + ( + "vector", + "xyxy_sequence", + "triggering_anchors", + "minimum_crossing_threshold", + "expected_crossed_in", + "expected_crossed_out", + ), [ ( # Detection lingers around line, all crosses counted Vector(Point(0, 0), Point(10, 0)), @@ -610,9 +627,17 @@ def test_line_zone_one_detection_long_horizon( @pytest.mark.parametrize( - "vector, xyxy_sequence, anchors, minimum_crossing_threshold, " - "expected_crossed_in, expected_crossed_out, expected_count_in, " - "expected_count_out, exception", + ( + "vector", + "xyxy_sequence", + "anchors", + "minimum_crossing_threshold", + "expected_crossed_in", + "expected_crossed_out", + "expected_count_in", + "expected_count_out", + "exception", + ), [ ( # One stays, one crosses, one disappears before crossing Vector(Point(0, 0), Point(10, 0)), diff --git a/test/detection/test_polygon_zone_annotator.py b/test/detection/test_polygon_zone_annotator.py index d28a4eec..ad0202f1 100644 --- a/test/detection/test_polygon_zone_annotator.py +++ b/test/detection/test_polygon_zone_annotator.py @@ -22,7 +22,7 @@ ANNOTATED_SCENE_0_5_OPACITY = sv.draw_filled_polygon( @pytest.mark.parametrize( - "scene, polygon_zone_annotator, expected_results", + ("scene", "polygon_zone_annotator", "expected_results"), [ ( SCENE, diff --git a/test/detection/test_polygonzone.py b/test/detection/test_polygonzone.py index dce6a13d..deda62ed 100644 --- a/test/detection/test_polygonzone.py +++ b/test/detection/test_polygonzone.py @@ -29,7 +29,7 @@ POLYGON = np.array([[100, 100], [200, 100], [200, 200], [100, 200]]) @pytest.mark.parametrize( - "detections, polygon_zone, expected_results, exception", + ("detections", "polygon_zone", "expected_results", "exception"), [ ( DETECTIONS, @@ -90,7 +90,7 @@ def test_polygon_zone_trigger( @pytest.mark.parametrize( - "polygon, triggering_anchors, exception", + ("polygon", "triggering_anchors", "exception"), [ (POLYGON, [sv.Position.CENTER], DoesNotRaise()), ( diff --git a/test/detection/test_vlm.py b/test/detection/test_vlm.py index 9a0195f7..426a3b9f 100644 --- a/test/detection/test_vlm.py +++ b/test/detection/test_vlm.py @@ -20,7 +20,7 @@ from supervision.detection.vlm import ( @pytest.mark.parametrize( - "exception, result, resolution_wh, classes, expected_results", + ("exception", "result", "resolution_wh", "classes", "expected_results"), [ ( does_not_raise(), @@ -202,7 +202,7 @@ def test_from_paligemma( @pytest.mark.parametrize( - "exception, result, input_wh, resolution_wh, classes, expected_results", + ("exception", "result", "input_wh", "resolution_wh", "classes", "expected_results"), [ ( does_not_raise(), @@ -405,7 +405,7 @@ def test_from_qwen_2_5_vl( @pytest.mark.parametrize( - "exception, result, resolution_wh, classes, expected_results", + ("exception", "result", "resolution_wh", "classes", "expected_results"), [ ( does_not_raise(), @@ -544,7 +544,7 @@ def test_from_google_gemini( @pytest.mark.parametrize( - "exception, result, resolution_wh, expected_results", + ("exception", "result", "resolution_wh", "expected_results"), [ ( does_not_raise(), @@ -644,7 +644,7 @@ def test_from_moondream( @pytest.mark.parametrize( - "florence_result, resolution_wh, expected_results, exception", + ("florence_result", "resolution_wh", "expected_results", "exception"), [ ( # Object detection: empty {"": {"bboxes": [], "labels": []}}, @@ -792,38 +792,6 @@ def test_from_moondream( ), DoesNotRaise(), ), - ( # Referring Expression Segmentation - { - "": { - "polygons": [[[1, 1, 2, 1, 2, 2, 1, 2]]], - "labels": [""], - } - }, - (10, 10), - ( - np.array([[1.0, 1.0, 2.0, 2.0]], dtype=np.float32), - None, - np.array( - [ - [ - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - ] - ], - dtype=bool, - ), - None, - ), - DoesNotRaise(), - ), ( # OCR: unsupported {"": "A"}, (10, 10), @@ -928,7 +896,7 @@ def test_florence_2( @pytest.mark.parametrize( - "exception, result, resolution_wh, classes, expected_results", + ("exception", "result", "resolution_wh", "classes", "expected_results"), [ ( does_not_raise(), @@ -1165,7 +1133,7 @@ def test_from_google_gemini_2_5( @pytest.mark.parametrize( - "exception, result, resolution_wh, classes, expected_detections", + ("exception", "result", "resolution_wh", "classes", "expected_detections"), [ ( pytest.raises(ValueError), diff --git a/test/detection/tools/test_inference_slicer.py b/test/detection/tools/test_inference_slicer.py index 7c313841..181fb9ab 100644 --- a/test/detection/tools/test_inference_slicer.py +++ b/test/detection/tools/test_inference_slicer.py @@ -18,7 +18,7 @@ def mock_callback(): @pytest.mark.parametrize( - "resolution_wh, slice_wh, overlap_wh, expected_offsets", + ("resolution_wh", "slice_wh", "overlap_wh", "expected_offsets"), [ # Case 1: Square image, square slices, no overlap ( diff --git a/test/detection/utils/test_boxes.py b/test/detection/utils/test_boxes.py index 66d0d999..6a2d07bb 100644 --- a/test/detection/utils/test_boxes.py +++ b/test/detection/utils/test_boxes.py @@ -14,7 +14,7 @@ from supervision.detection.utils.boxes import ( @pytest.mark.parametrize( - "xyxy, resolution_wh, expected_result", + ("xyxy", "resolution_wh", "expected_result"), [ ( np.empty(shape=(0, 4)), @@ -58,7 +58,7 @@ def test_clip_boxes( @pytest.mark.parametrize( - "xyxy, offset, expected_result, exception", + ("xyxy", "offset", "expected_result", "exception"), [ ( np.empty(shape=(0, 4)), @@ -104,7 +104,7 @@ def test_move_boxes( @pytest.mark.parametrize( - "xyxy, factor, expected_result, exception", + ("xyxy", "factor", "expected_result", "exception"), [ ( np.empty(shape=(0, 4)), @@ -150,7 +150,7 @@ def test_scale_boxes( @pytest.mark.parametrize( - "xyxy, resolution_wh, normalization_factor, expected_result, exception", + ("xyxy", "resolution_wh", "normalization_factor", "expected_result", "exception"), [ ( np.empty(shape=(0, 4)), diff --git a/test/detection/utils/test_converters.py b/test/detection/utils/test_converters.py index 52a3b520..5372343e 100644 --- a/test/detection/utils/test_converters.py +++ b/test/detection/utils/test_converters.py @@ -13,7 +13,7 @@ from supervision.detection.utils.converters import ( @pytest.mark.parametrize( - "xywh, expected_result", + ("xywh", "expected_result"), [ (np.array([[10, 20, 30, 40]]), np.array([[10, 20, 40, 60]])), # standard case (np.array([[0, 0, 0, 0]]), np.array([[0, 0, 0, 0]])), # zero size bounding box @@ -36,7 +36,7 @@ def test_xywh_to_xyxy(xywh: np.ndarray, expected_result: np.ndarray) -> None: @pytest.mark.parametrize( - "xyxy, expected_result", + ("xyxy", "expected_result"), [ (np.array([[10, 20, 40, 60]]), np.array([[10, 20, 30, 40]])), # standard case (np.array([[0, 0, 0, 0]]), np.array([[0, 0, 0, 0]])), # zero size bounding box @@ -59,7 +59,7 @@ def test_xyxy_to_xywh(xyxy: np.ndarray, expected_result: np.ndarray) -> None: @pytest.mark.parametrize( - "xyxy, expected_result", + ("xyxy", "expected_result"), [ # Empty and zero cases (np.array([]).reshape(0, 4), np.array([]).reshape(0, 4)), # empty array @@ -110,7 +110,7 @@ def test_xyxy_to_xcycarh(xyxy: np.ndarray, expected_result: np.ndarray) -> None: @pytest.mark.parametrize( - "xcycwh, expected_result", + ("xcycwh", "expected_result"), [ (np.array([[50, 50, 20, 30]]), np.array([[40, 35, 60, 65]])), # standard case (np.array([[0, 0, 0, 0]]), np.array([[0, 0, 0, 0]])), # zero size bounding box @@ -133,7 +133,7 @@ def test_xcycwh_to_xyxy(xcycwh: np.ndarray, expected_result: np.ndarray) -> None @pytest.mark.parametrize( - "boxes,resolution_wh,expected", + ("boxes", "resolution_wh", "expected"), [ # 0) Empty input ( diff --git a/test/detection/utils/test_internal.py b/test/detection/utils/test_internal.py index 0164d323..60ed4f52 100644 --- a/test/detection/utils/test_internal.py +++ b/test/detection/utils/test_internal.py @@ -19,7 +19,7 @@ TEST_MASK[:, 300:351, 200:251] = True @pytest.mark.parametrize( - "roboflow_result, expected_result, exception", + ("roboflow_result", "expected_result", "exception"), [ ( {"predictions": [], "image": {"width": 1000, "height": 1000}}, @@ -251,7 +251,7 @@ def test_process_roboflow_result( @pytest.mark.parametrize( - "data_list, expected_result, exception", + ("data_list", "expected_result", "exception"), [ ( [], @@ -445,7 +445,7 @@ def test_merge_data( with exception: result = merge_data(data_list=data_list) if expected_result is None: - assert False, f"Expected an error, but got result {result}" + pytest.fail(f"Expected an error, but got result {result}") for key in result: if isinstance(result[key], np.ndarray): @@ -459,7 +459,7 @@ def test_merge_data( @pytest.mark.parametrize( - "data, index, expected_result, exception", + ("data", "index", "expected_result", "exception"), [ ({}, 0, {}, DoesNotRaise()), # empty data dict ( @@ -632,7 +632,7 @@ def test_get_data_item( @pytest.mark.parametrize( - "metadata_list, expected_result, exception", + ("metadata_list", "expected_result", "exception"), [ # Identical metadata with a single key ([{"key1": "value1"}, {"key1": "value1"}], {"key1": "value1"}, DoesNotRaise()), diff --git a/test/detection/utils/test_iou_and_nms.py b/test/detection/utils/test_iou_and_nms.py index ab758648..939edc36 100644 --- a/test/detection/utils/test_iou_and_nms.py +++ b/test/detection/utils/test_iou_and_nms.py @@ -18,7 +18,7 @@ from test.test_utils import random_boxes @pytest.mark.parametrize( - "predictions, iou_threshold, expected_result, exception", + ("predictions", "iou_threshold", "expected_result", "exception"), [ ( np.empty(shape=(0, 5), dtype=float), @@ -145,7 +145,7 @@ def test_group_overlapping_boxes( @pytest.mark.parametrize( - "predictions, iou_threshold, expected_result, exception", + ("predictions", "iou_threshold", "expected_result", "exception"), [ ( np.empty(shape=(0, 5)), @@ -250,7 +250,7 @@ def test_box_non_max_suppression( @pytest.mark.parametrize( - "predictions, masks, iou_threshold, expected_result, exception", + ("predictions", "masks", "iou_threshold", "expected_result", "exception"), [ ( np.empty((0, 6)), @@ -456,7 +456,7 @@ def test_mask_non_max_suppression( @pytest.mark.parametrize( - "predictions, masks, iou_threshold, expected_result, exception", + ("predictions", "masks", "iou_threshold", "expected_result", "exception"), [ ( np.empty((0, 6)), @@ -638,7 +638,7 @@ def test_mask_non_max_merge( @pytest.mark.parametrize( - "box_true, box_detection, overlap_metric, expected_overlap, exception", + ("box_true", "box_detection", "overlap_metric", "expected_overlap", "exception"), [ ( [100.0, 100.0, 200.0, 200.0], @@ -689,13 +689,6 @@ def test_mask_non_max_merge( 1.0, DoesNotRaise(), ), # identical boxes, both boxes are arrays, IOU as uppercase string - ( - [0.0, 0.0, 10.0, 10.0], - [0.0, 0.0, 10.0, 10.0], - "IOU", - 1.0, - DoesNotRaise(), - ), # identical boxes, both boxes are arrays, IOS as uppercase string ( [0.0, 0.0, 10.0, 10.0], [20.0, 20.0, 30.0, 30.0], @@ -813,7 +806,13 @@ def test_box_iou( @pytest.mark.parametrize( - "boxes_true, boxes_detection, overlap_metric, expected_overlap, exception", + ( + "boxes_true", + "boxes_detection", + "overlap_metric", + "expected_overlap", + "exception", + ), [ # both inputs empty ( @@ -1086,7 +1085,7 @@ def test_box_iou_batch( @pytest.mark.parametrize( - "num_true, num_det", + ("num_true", "num_det"), [ (5, 5), (5, 10), diff --git a/test/detection/utils/test_masks.py b/test/detection/utils/test_masks.py index b41f208e..e35e4661 100644 --- a/test/detection/utils/test_masks.py +++ b/test/detection/utils/test_masks.py @@ -16,7 +16,7 @@ from supervision.detection.utils.masks import ( @pytest.mark.parametrize( - "masks, offset, resolution_wh, expected_result, exception", + ("masks", "offset", "resolution_wh", "expected_result", "exception"), [ ( np.array( @@ -278,7 +278,7 @@ def test_move_masks( @pytest.mark.parametrize( - "masks, expected_result, exception", + ("masks", "expected_result", "exception"), [ ( np.array( @@ -369,7 +369,7 @@ def test_calculate_masks_centroids( @pytest.mark.parametrize( - "mask, expected_result, exception", + ("mask", "expected_result", "exception"), [ ( np.array([[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 0, 0], [0, 1, 1, 0]]).astype( @@ -424,7 +424,7 @@ def test_contains_holes( @pytest.mark.parametrize( - "mask, connectivity, expected_result, exception", + ("mask", "connectivity", "expected_result", "exception"), [ ( np.array([[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 0, 0], [0, 1, 1, 0]]).astype( @@ -504,7 +504,15 @@ def test_contains_multiple_segments( @pytest.mark.parametrize( - "mask, connectivity, mode, absolute_distance, relative_distance, expected_result, exception", # noqa: E501 + ( + "mask", + "connectivity", + "mode", + "absolute_distance", + "relative_distance", + "expected_result", + "exception", + ), [ # single component, unchanged ( diff --git a/test/detection/utils/test_polygons.py b/test/detection/utils/test_polygons.py index c1ac0f3a..b9f8cc4b 100644 --- a/test/detection/utils/test_polygons.py +++ b/test/detection/utils/test_polygons.py @@ -9,7 +9,7 @@ from supervision.detection.utils.polygons import filter_polygons_by_area @pytest.mark.parametrize( - "polygons, min_area, max_area, expected_result, exception", + ("polygons", "min_area", "max_area", "expected_result", "exception"), [ ( [np.array([[0, 0], [0, 10], [10, 10], [10, 0]])], diff --git a/test/detection/utils/test_vlms.py b/test/detection/utils/test_vlms.py index a6fe649b..805c9681 100644 --- a/test/detection/utils/test_vlms.py +++ b/test/detection/utils/test_vlms.py @@ -4,7 +4,7 @@ from supervision.detection.utils.vlms import edit_distance, fuzzy_match_index @pytest.mark.parametrize( - "string_1, string_2, case_sensitive, expected_result", + ("string_1", "string_2", "case_sensitive", "expected_result"), [ # identical strings, various cases ("hello", "hello", True, 0), @@ -68,7 +68,7 @@ def test_edit_distance(string_1, string_2, case_sensitive, expected_result): @pytest.mark.parametrize( - "candidates, query, threshold, case_sensitive, expected_result", + ("candidates", "query", "threshold", "case_sensitive", "expected_result"), [ # exact match at index 0 (["cat", "dog", "rat"], "cat", 0, True, 0), diff --git a/test/draw/test_color.py b/test/draw/test_color.py index 05ad6862..076e8537 100644 --- a/test/draw/test_color.py +++ b/test/draw/test_color.py @@ -8,7 +8,7 @@ from supervision.draw.color import Color @pytest.mark.parametrize( - "color_hex, expected_result, exception", + ("color_hex", "expected_result", "exception"), [ ("fff", Color.WHITE, DoesNotRaise()), ("#fff", Color.WHITE, DoesNotRaise()), @@ -34,7 +34,7 @@ def test_color_from_hex( @pytest.mark.parametrize( - "color, expected_result, exception", + ("color", "expected_result", "exception"), [ (Color.WHITE, "#ffffff", DoesNotRaise()), (Color.BLACK, "#000000", DoesNotRaise()), diff --git a/test/geometry/test_core.py b/test/geometry/test_core.py index f113fec9..5500fb3c 100644 --- a/test/geometry/test_core.py +++ b/test/geometry/test_core.py @@ -4,7 +4,7 @@ from supervision.geometry.core import Point, Vector @pytest.mark.parametrize( - "vector, point, expected_result", + ("vector", "point", "expected_result"), [ (Vector(start=Point(x=0, y=0), end=Point(x=5, y=5)), Point(x=-1, y=1), 10.0), (Vector(start=Point(x=0, y=0), end=Point(x=5, y=5)), Point(x=6, y=6), 0.0), @@ -34,7 +34,7 @@ def test_vector_cross_product( @pytest.mark.parametrize( - "vector, expected_result", + ("vector", "expected_result"), [ (Vector(start=Point(x=0, y=0), end=Point(x=0, y=0)), 0.0), (Vector(start=Point(x=1, y=0), end=Point(x=0, y=0)), 1.0), diff --git a/test/geometry/test_utils.py b/test/geometry/test_utils.py index f4352d5e..b4cbb95c 100644 --- a/test/geometry/test_utils.py +++ b/test/geometry/test_utils.py @@ -35,7 +35,7 @@ def generate_test_polygon(n: int) -> np.ndarray: @pytest.mark.parametrize( - "polygon, expected_result", + ("polygon", "expected_result"), [ (generate_test_polygon(10), Point(x=5.0, y=12.0)), (generate_test_polygon(50), Point(x=25.0, y=61.0)), diff --git a/test/key_points/test_core.py b/test/key_points/test_core.py index 5a8244cd..ab04d242 100644 --- a/test/key_points/test_core.py +++ b/test/key_points/test_core.py @@ -22,7 +22,7 @@ KEY_POINTS = mock_key_points( @pytest.mark.parametrize( - "key_points, index, expected_result, exception", + ("key_points", "index", "expected_result", "exception"), [ ( KeyPoints.empty(), diff --git a/test/metrics/test_detection.py b/test/metrics/test_detection.py index f5be7ac6..2c84eedb 100644 --- a/test/metrics/test_detection.py +++ b/test/metrics/test_detection.py @@ -123,7 +123,7 @@ BAD_CONF_MATRIX = worsen_ideal_conf_matrix( @pytest.mark.parametrize( - "detections, with_confidence, expected_result, exception", + ("detections", "with_confidence", "expected_result", "exception"), [ ( Detections.empty(), @@ -187,8 +187,15 @@ def test_detections_to_tensor( @pytest.mark.parametrize( - "predictions, targets, classes, conf_threshold, iou_threshold, expected_result," - " exception", + ( + "predictions", + "targets", + "classes", + "conf_threshold", + "iou_threshold", + "expected_result", + "exception", + ), [ ( DETECTION_TENSORS, @@ -359,8 +366,15 @@ def test_from_tensors( @pytest.mark.parametrize( - "predictions, targets, num_classes, conf_threshold, iou_threshold, expected_result," - " exception", + ( + "predictions", + "targets", + "num_classes", + "conf_threshold", + "iou_threshold", + "expected_result", + "exception", + ), [ ( DETECTION_TENSORS[0], @@ -396,7 +410,7 @@ def test_evaluate_detection_batch( @pytest.mark.parametrize( - "matches, expected_result, exception", + ("matches", "expected_result", "exception"), [ ( IDEAL_MATCHES, @@ -417,7 +431,7 @@ def test_drop_extra_matches( @pytest.mark.parametrize( - "recall, precision, expected_result, exception", + ("recall", "precision", "expected_result", "exception"), [ ( np.array([1.0]), diff --git a/test/metrics/test_mean_average_precision_area.py b/test/metrics/test_mean_average_precision_area.py index 83262096..fcc3991a 100644 --- a/test/metrics/test_mean_average_precision_area.py +++ b/test/metrics/test_mean_average_precision_area.py @@ -11,7 +11,7 @@ class TestMeanAveragePrecisionArea: """Test area calculation in MeanAveragePrecision.""" @pytest.mark.parametrize( - "xyxy, expected_areas, expected_size_maps", + ("xyxy", "expected_areas", "expected_size_maps"), [ ( np.array( diff --git a/test/tracker/test_byte_tracker.py b/test/tracker/test_byte_tracker.py index 7ca94bbf..c653fd06 100644 --- a/test/tracker/test_byte_tracker.py +++ b/test/tracker/test_byte_tracker.py @@ -5,7 +5,7 @@ import supervision as sv @pytest.mark.parametrize( - "detections, expected_results", + ("detections", "expected_results"), [ ( [ diff --git a/test/utils/test_file.py b/test/utils/test_file.py index 7cee8944..cf0f3db8 100644 --- a/test/utils/test_file.py +++ b/test/utils/test_file.py @@ -43,7 +43,7 @@ def setup_and_teardown_files(): @pytest.mark.parametrize( - "file_name, skip_empty, expected_result, exception", + ("file_name", "skip_empty", "expected_result", "exception"), [ ("file_1.txt", False, ["Line 1", "Line 2", "Line 3"], DoesNotRaise()), ("file_2.txt", True, ["Line 2", "Line 4"], DoesNotRaise()), diff --git a/test/utils/test_image.py b/test/utils/test_image.py index 688f938b..f7e68ecd 100644 --- a/test/utils/test_image.py +++ b/test/utils/test_image.py @@ -103,7 +103,7 @@ def test_letterbox_image_for_pillow_image() -> None: @pytest.mark.parametrize( - "image, xyxy, expected_size", + ("image", "xyxy", "expected_size"), [ # NumPy RGB ( @@ -143,7 +143,7 @@ def test_crop_image(image, xyxy, expected_size): @pytest.mark.parametrize( - "image, expected", + ("image", "expected"), [ # NumPy RGB (np.zeros((4, 6, 3), dtype=np.uint8), (6, 4)), diff --git a/test/utils/test_internal.py b/test/utils/test_internal.py index 749d4be3..ff34607e 100644 --- a/test/utils/test_internal.py +++ b/test/utils/test_internal.py @@ -74,7 +74,7 @@ class MockDataclass: @pytest.mark.parametrize( - "input_instance, include_properties, expected, exception", + ("input_instance", "include_properties", "expected", "exception"), [ ( MockClass, @@ -184,20 +184,6 @@ class MockDataclass: }, DoesNotRaise(), ), - ( - Detections.empty(), - False, - { - "xyxy", - "class_id", - "confidence", - "mask", - "tracker_id", - "data", - "metadata", - }, - DoesNotRaise(), - ), ], ) def test_get_instance_variables( diff --git a/test/utils/test_iterables.py b/test/utils/test_iterables.py index 2d34605c..c48130be 100644 --- a/test/utils/test_iterables.py +++ b/test/utils/test_iterables.py @@ -4,7 +4,7 @@ from supervision.utils.iterables import create_batches, fill @pytest.mark.parametrize( - "sequence, batch_size, expected", + ("sequence", "batch_size", "expected"), [ # Empty sequence, non-zero batch size. Expect empty list. ([], 4, []), @@ -24,7 +24,7 @@ def test_create_batches(sequence, batch_size, expected) -> None: @pytest.mark.parametrize( - "sequence, desired_size, content, expected", + ("sequence", "desired_size", "content", "expected"), [ # Empty sequence, desired size 0. Expect empty list. ([], 0, 1, []),