diff --git a/src/label_studio_sdk/label_interface/control_tags.py b/src/label_studio_sdk/label_interface/control_tags.py index 199c80f..45e0213 100644 --- a/src/label_studio_sdk/label_interface/control_tags.py +++ b/src/label_studio_sdk/label_interface/control_tags.py @@ -478,7 +478,7 @@ def get_labels(self, regions: List[Dict]): labels.append(v[0] if len(v) == 1 else v) else: labels.append(value) - return labels + return labels[0] if len(labels) == 1 else labels def as_tuple(self): """ """ diff --git a/tests/custom/test_interface/test_control_tags.py b/tests/custom/test_interface/test_control_tags.py index 73910bd..5ea724c 100644 --- a/tests/custom/test_interface/test_control_tags.py +++ b/tests/custom/test_interface/test_control_tags.py @@ -1,8 +1,9 @@ import json +import pytest from lxml.etree import Element from label_studio_sdk.label_interface import LabelInterface -from label_studio_sdk.label_interface.control_tags import ControlTag +from label_studio_sdk.label_interface.control_tags import ControlTag, ChoicesTag, LabelsTag, RectangleLabelsTag from . import configs as c @@ -53,3 +54,53 @@ def test_label_with_choices(): assert "choices" in rpy.get("value") assert c.LABEL1 in rpy["value"]["choices"] + + +@pytest.mark.parametrize("tag, regions, expected", [ + # Test case 1: ChoicesTag with single choice + ( + ChoicesTag(name="choices", to_name=["text"], tag="Choices"), + [{"from_name": "choices", "value": {"choices": ["positive"]}}], + "positive" + ), + + # Test case 2: ChoicesTag with multiple choices + ( + ChoicesTag(name="choices", to_name=["text"], tag="Choices"), + [{"from_name": "choices", "value": {"choices": ["positive", "negative"]}}], + ["positive", "negative"] + ), + + # Test case 3: Multiple regions with labels + ( + LabelsTag(name="label", to_name=["text"], tag="Labels"), + [ + {"from_name": "label", "to_name": "text", "value": {"labels": ["positive"], "start": 0, "end": 1}}, + {"from_name": "label", "to_name": "text", "value": {"labels": ["negative"], "start": 2, "end": 3}} + ], + [{"start": 0, "end": 1, "labels": ["positive"]}, {"start": 2, "end": 3, "labels": ["negative"]}] + ), + + # Test case 4: Empty regions + ( + ChoicesTag(name="choices", to_name=["text"], tag="Choices"), + [], + [] + ), + + # Test case 5: Regions with different from_name + ( + ChoicesTag(name="choices", to_name=["text"], tag="Choices"), + [{"from_name": "other_tag", "value": {"choices": ["positive"]}}], + [] + ), + + # Test case 6: Tag without label_attr_name + ( + ControlTag(name="base", to_name=["text"], tag="BaseTag"), + [{"from_name": "base", "value": {"some_value": 42}}], + [{"some_value": 42}] + ), +]) +def test_control_tag_get_labels(tag, regions, expected): + assert tag.get_labels(regions) == expected