Skip to content

Commit cc9d6af

Browse files
authored
[PLT-1339] Fixed Cuid dependencies that crash if numpy was not installed (#1807)
1 parent 3fa7fd8 commit cc9d6af

File tree

9 files changed

+55
-44
lines changed

9 files changed

+55
-44
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from typing_extensions import Annotated
2+
3+
from pydantic import Field
4+
5+
6+
Cuid = Annotated[str, Field(min_length=25, max_length=25)]

libs/labelbox/src/labelbox/data/annotation_types/feature.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22
from pydantic import BaseModel, model_validator, model_serializer
3-
from .types import Cuid
3+
4+
from ...annotated_types import Cuid
45

56

67
class FeatureSchema(BaseModel):

libs/labelbox/src/labelbox/data/annotation_types/label.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
from labelbox.data.annotation_types.data.generic_data_row_data import GenericDataRowData
77
from labelbox.data.annotation_types.data.tiled_image import TiledImageData
88
from labelbox.schema import ontology
9+
10+
from ...annotated_types import Cuid
911
from .annotation import ClassificationAnnotation, ObjectAnnotation
1012
from .relationship import RelationshipAnnotation
1113
from .llm_prompt_response.prompt import PromptClassificationAnnotation
1214
from .classification import ClassificationAnswer
1315
from .data import AudioData, ConversationData, DicomData, DocumentData, HTMLData, ImageData, TextData, VideoData, LlmPromptCreationData, LlmPromptResponseCreationData, LlmResponseCreationData
1416
from .geometry import Mask
1517
from .metrics import ScalarMetric, ConfusionMatrixMetric
16-
from .types import Cuid
1718
from .video import VideoClassificationAnnotation
1819
from .video import VideoObjectAnnotation, VideoMaskAnnotation
1920
from .mmc import MessageEvaluationTaskAnnotation

libs/labelbox/src/labelbox/data/annotation_types/types.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
from pydantic import StringConstraints, Field
99

10-
Cuid = Annotated[str, StringConstraints(min_length=25, max_length=25)]
11-
1210
DType = TypeVar('DType')
1311
DShape = TypeVar('DShape')
1412

libs/labelbox/src/labelbox/data/serialization/ndjson/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
from uuid import uuid4
33

44
from labelbox.utils import _CamelCaseMixin, is_exactly_one_set
5-
from ...annotation_types.types import Cuid
65
from pydantic import model_validator, ConfigDict, BaseModel, Field
76
from uuid import uuid4
87
import threading
98

9+
from ....annotated_types import Cuid
10+
1011
subclass_registry = {}
1112

1213
class _SubclassRegistryBase(BaseModel):

libs/labelbox/src/labelbox/data/serialization/ndjson/classification.py

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from typing import Any, Dict, List, Union, Optional
22

3+
from labelbox.data.annotation_types import ImageData, TextData, VideoData
34
from labelbox.data.mixins import ConfidenceMixin, CustomMetric, CustomMetricsMixin
45
from labelbox.data.serialization.ndjson.base import DataRow, NDAnnotation
56

7+
from ....annotated_types import Cuid
8+
69
from ...annotation_types.annotation import ClassificationAnnotation
710
from ...annotation_types.video import VideoClassificationAnnotation
811
from ...annotation_types.llm_prompt_response.prompt import PromptClassificationAnnotation, PromptText
912
from ...annotation_types.classification.classification import ClassificationAnswer, Text, Checklist, Radio
10-
from ...annotation_types.types import Cuid
11-
from ...annotation_types.data import TextData, VideoData, ImageData
1213
from pydantic import model_validator, Field, BaseModel, ConfigDict, model_serializer
1314
from pydantic.alias_generators import to_camel
1415
from .base import _SubclassRegistryBase
@@ -18,11 +19,12 @@ class NDAnswer(ConfidenceMixin, CustomMetricsMixin):
1819
name: Optional[str] = None
1920
schema_id: Optional[Cuid] = None
2021
classifications: Optional[List['NDSubclassificationType']] = None
21-
model_config = ConfigDict(populate_by_name = True, alias_generator = to_camel)
22+
model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
2223

2324
@model_validator(mode="after")
2425
def must_set_one(self):
25-
if (not hasattr(self, "schema_id") or self.schema_id is None) and (not hasattr(self, "name") or self.name is None):
26+
if (not hasattr(self, "schema_id") or self.schema_id
27+
is None) and (not hasattr(self, "name") or self.name is None):
2628
raise ValueError("Schema id or name are not set. Set either one.")
2729
return self
2830

@@ -102,7 +104,10 @@ def from_common(cls, checklist: Checklist, name: str,
102104
NDAnswer(name=answer.name,
103105
schema_id=answer.feature_schema_id,
104106
confidence=answer.confidence,
105-
classifications=[NDSubclassification.from_common(annot) for annot in answer.classifications] if answer.classifications else None,
107+
classifications=[
108+
NDSubclassification.from_common(annot)
109+
for annot in answer.classifications
110+
] if answer.classifications else None,
106111
custom_metrics=answer.custom_metrics)
107112
for answer in checklist.answer
108113
],
@@ -152,8 +157,8 @@ class NDPromptTextSubclass(NDAnswer):
152157

153158
def to_common(self) -> PromptText:
154159
return PromptText(answer=self.answer,
155-
confidence=self.confidence,
156-
custom_metrics=self.custom_metrics)
160+
confidence=self.confidence,
161+
custom_metrics=self.custom_metrics)
157162

158163
@classmethod
159164
def from_common(cls, prompt_text: PromptText, name: str,
@@ -194,7 +199,8 @@ def from_common(cls,
194199
)
195200

196201

197-
class NDChecklist(NDAnnotation, NDChecklistSubclass, VideoSupported, _SubclassRegistryBase):
202+
class NDChecklist(NDAnnotation, NDChecklistSubclass, VideoSupported,
203+
_SubclassRegistryBase):
198204

199205
@model_serializer(mode="wrap")
200206
def serialize_model(self, handler):
@@ -237,7 +243,8 @@ def from_common(
237243
confidence=confidence)
238244

239245

240-
class NDRadio(NDAnnotation, NDRadioSubclass, VideoSupported, _SubclassRegistryBase):
246+
class NDRadio(NDAnnotation, NDRadioSubclass, VideoSupported,
247+
_SubclassRegistryBase):
241248

242249
@classmethod
243250
def from_common(
@@ -266,35 +273,32 @@ def from_common(
266273
frames=extra.get('frames'),
267274
message_id=message_id,
268275
confidence=confidence)
269-
276+
270277
@model_serializer(mode="wrap")
271278
def serialize_model(self, handler):
272279
res = handler(self)
273280
if "classifications" in res and res["classifications"] == []:
274281
del res["classifications"]
275282
return res
276-
277-
283+
284+
278285
class NDPromptText(NDAnnotation, NDPromptTextSubclass, _SubclassRegistryBase):
279-
286+
280287
@classmethod
281-
def from_common(
282-
cls,
283-
uuid: str,
284-
text: PromptText,
285-
name,
286-
data: Dict,
287-
feature_schema_id: Cuid,
288-
confidence: Optional[float] = None
289-
) -> "NDPromptText":
290-
return cls(
291-
answer=text.answer,
292-
data_row=DataRow(id=data.uid, global_key=data.global_key),
293-
name=name,
294-
schema_id=feature_schema_id,
295-
uuid=uuid,
296-
confidence=text.confidence,
297-
custom_metrics=text.custom_metrics)
288+
def from_common(cls,
289+
uuid: str,
290+
text: PromptText,
291+
name,
292+
data: Dict,
293+
feature_schema_id: Cuid,
294+
confidence: Optional[float] = None) -> "NDPromptText":
295+
return cls(answer=text.answer,
296+
data_row=DataRow(id=data.uid, global_key=data.global_key),
297+
name=name,
298+
schema_id=feature_schema_id,
299+
uuid=uuid,
300+
confidence=text.confidence,
301+
custom_metrics=text.custom_metrics)
298302

299303

300304
class NDSubclassification:
@@ -350,7 +354,8 @@ def to_common(
350354
for frame in annotation.frames:
351355
for idx in range(frame.start, frame.end + 1, 1):
352356
results.append(
353-
VideoClassificationAnnotation(frame=idx, **common.model_dump(exclude_none=True)))
357+
VideoClassificationAnnotation(
358+
frame=idx, **common.model_dump(exclude_none=True)))
354359
return results
355360

356361
@classmethod
@@ -382,6 +387,7 @@ def lookup_classification(
382387
Radio: NDRadio
383388
}.get(type(annotation.value))
384389

390+
385391
class NDPromptClassification:
386392

387393
@staticmethod
@@ -404,8 +410,7 @@ def from_common(
404410
data: Union[VideoData, TextData, ImageData]
405411
) -> Union[NDTextSubclass, NDChecklistSubclass, NDRadioSubclass]:
406412
return NDPromptText.from_common(str(annotation._uuid), annotation.value,
407-
annotation.name,
408-
data,
413+
annotation.name, data,
409414
annotation.feature_schema_id,
410415
annotation.confidence)
411416

@@ -427,4 +432,4 @@ def from_common(
427432
# Make sure to keep NDChecklist prior to NDRadio in the list,
428433
# otherwise list of answers gets parsed by NDRadio whereas NDChecklist must be used
429434
NDClassificationType = Union[NDChecklist, NDRadio, NDText]
430-
NDPromptClassificationType = Union[NDPromptText]
435+
NDPromptClassificationType = Union[NDPromptText]

libs/labelbox/src/labelbox/data/serialization/ndjson/mmc.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from labelbox.utils import _CamelCaseMixin
44

55
from .base import _SubclassRegistryBase, DataRow, NDAnnotation
6-
from ...annotation_types.types import Cuid
76
from ...annotation_types.mmc import MessageSingleSelectionTask, MessageMultiSelectionTask, MessageRankingTask, MessageEvaluationTaskAnnotation
87

98

libs/labelbox/src/labelbox/data/serialization/ndjson/objects.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from labelbox.data.annotation_types.ner.conversation_entity import ConversationEntity
66
from labelbox.data.annotation_types.video import VideoObjectAnnotation, DICOMObjectAnnotation
77
from labelbox.data.mixins import ConfidenceMixin, CustomMetricsMixin, CustomMetric, CustomMetricsNotSupportedMixin
8+
from ....annotated_types import Cuid
89
import numpy as np
910

1011
from PIL import Image
@@ -14,7 +15,6 @@
1415

1516
from ...annotation_types.data import ImageData, TextData, MaskData
1617
from ...annotation_types.ner import DocumentEntity, DocumentTextSelection, TextEntity
17-
from ...annotation_types.types import Cuid
1818
from ...annotation_types.geometry import DocumentRectangle, Rectangle, Polygon, Line, Point, Mask
1919
from ...annotation_types.annotation import ClassificationAnnotation, ObjectAnnotation
2020
from ...annotation_types.video import VideoMaskAnnotation, DICOMMaskAnnotation, MaskFrame, MaskInstance

libs/labelbox/src/labelbox/schema/labeling_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
from typing import Any
33
from typing_extensions import Annotated
44

5-
from labelbox.exceptions import ResourceNotFoundError
6-
75
from pydantic import BaseModel, Field
6+
7+
from labelbox.exceptions import ResourceNotFoundError
88
from labelbox.utils import _CamelCaseMixin
99
from labelbox.schema.labeling_service_dashboard import LabelingServiceDashboard
1010
from labelbox.schema.labeling_service_status import LabelingServiceStatus
1111

12-
Cuid = Annotated[str, Field(min_length=25, max_length=25)]
12+
from ..annotated_types import Cuid
1313

1414

1515
class LabelingService(_CamelCaseMixin):

0 commit comments

Comments
 (0)