Skip to content

Commit 62da684

Browse files
committed
Added tag instance to Document
1 parent bcbeb50 commit 62da684

File tree

9 files changed

+468
-236
lines changed

9 files changed

+468
-236
lines changed

src/superannotate_schemas/schemas/base.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from superannotate_schemas.schemas.enums import VectorAnnotationTypeEnum
2727
from superannotate_schemas.schemas.enums import AnnotationStatusEnum
2828
from superannotate_schemas.schemas.enums import ClassTypeEnum
29+
from superannotate_schemas.schemas.enums import DocumentAnnotationTypeEnum
2930
from superannotate_schemas.schemas.constances import DATE_REGEX
3031
from superannotate_schemas.schemas.constances import DATE_TIME_FORMAT_ERROR_MESSAGE
3132
from superannotate_schemas.schemas.constances import POINT_LABEL_VALUE_FORMAT_ERROR_MESSAGE
@@ -239,6 +240,10 @@ class BaseVectorInstance(BaseImageAnnotationInstance):
239240
group_id: Optional[int] = Field(alias="groupId")
240241

241242

243+
class BaseDocumentInstance(BaseInstance):
244+
type: DocumentAnnotationTypeEnum
245+
246+
242247
class HexColor(BaseModel):
243248
__root__: ColorType
244249

src/superannotate_schemas/schemas/enums.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ class VectorAnnotationTypeEnum(str, Enum):
1313
TAG = "tag"
1414

1515

16+
class DocumentAnnotationTypeEnum(str, Enum):
17+
ENTITY = "entity"
18+
TAG = "tag"
19+
20+
1621
class CreationTypeEnum(str, Enum):
1722
MANUAL = "Manual"
1823
PREDICTION = "Prediction"
Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,82 @@
11
from typing import List
22
from typing import Optional
3+
from typing import Union
4+
5+
from pydantic import Field
6+
from pydantic import StrictStr
7+
from pydantic import ValidationError
8+
from pydantic.error_wrappers import ErrorWrapper
39

410
from superannotate_schemas.schemas.base import BaseAttribute
5-
from superannotate_schemas.schemas.base import BaseInstance
11+
from superannotate_schemas.schemas.base import BaseDocumentInstance
612
from superannotate_schemas.schemas.base import BaseMetadata as Metadata
7-
from superannotate_schemas.schemas.base import Tag
8-
from superannotate_schemas.schemas.base import NotEmptyStr
9-
1013
from superannotate_schemas.schemas.base import BaseModel
11-
from pydantic import Field
12-
from pydantic import StrictStr
14+
from superannotate_schemas.schemas.base import INVALID_DICT_MESSAGE
15+
from superannotate_schemas.schemas.base import NotEmptyStr
16+
from superannotate_schemas.schemas.base import Tag
17+
from superannotate_schemas.schemas.enums import DocumentAnnotationTypeEnum
1318

1419

1520
class Attribute(BaseAttribute):
1621
name: NotEmptyStr
1722
group_name: NotEmptyStr = Field(alias="groupName")
1823

1924

20-
class DocumentInstance(BaseInstance):
25+
class EntityInstance(BaseDocumentInstance):
2126
start: int
2227
end: int
2328
attributes: Optional[List[Attribute]] = Field(list())
2429

2530

31+
class TagInstance(BaseDocumentInstance):
32+
attributes: Optional[List[Attribute]] = Field(list())
33+
34+
35+
class DocumentInstance(BaseDocumentInstance):
36+
pass
37+
38+
39+
ANNOTATION_TYPES = {
40+
DocumentAnnotationTypeEnum.ENTITY: EntityInstance,
41+
DocumentAnnotationTypeEnum.TAG: TagInstance,
42+
}
43+
44+
45+
class AnnotationInstance(BaseModel):
46+
__root__: Union[TagInstance, EntityInstance]
47+
48+
@classmethod
49+
def __get_validators__(cls):
50+
yield cls.return_action
51+
52+
@classmethod
53+
def return_action(cls, values):
54+
try:
55+
try:
56+
instance_type = values["type"]
57+
except KeyError:
58+
raise ValidationError(
59+
[ErrorWrapper(ValueError("field required"), "type")], cls
60+
)
61+
return ANNOTATION_TYPES[instance_type](**values)
62+
except KeyError:
63+
raise ValidationError(
64+
[
65+
ErrorWrapper(
66+
ValueError(
67+
f"invalid type, valid types are {', '.join(ANNOTATION_TYPES.keys())}"
68+
),
69+
"type",
70+
)
71+
],
72+
cls,
73+
)
74+
except TypeError as e:
75+
raise TypeError(INVALID_DICT_MESSAGE) from e
76+
77+
2678
class DocumentAnnotation(BaseModel):
2779
metadata: Metadata
28-
instances: Optional[List[DocumentInstance]] = Field(list())
80+
instances: Optional[List[AnnotationInstance]] = Field(list())
2981
tags: Optional[List[Tag]] = Field(list())
3082
free_text: Optional[StrictStr] = Field(None, alias="freeText")

src/superannotate_schemas/schemas/external/vector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class PolyLine(VectorInstance):
5252

5353
class Polygon(VectorInstance):
5454
points: conlist(Union[StrictFloat, StrictInt], min_items=3)
55+
exclude: Optional[List[List[Union[StrictFloat, StrictInt]]]] = []
5556

5657

5758
class Bbox(VectorInstance):
@@ -164,4 +165,3 @@ class VectorAnnotation(BaseModel):
164165
comments: Optional[List[Comment]] = Field(list())
165166
tags: Optional[List[Tag]] = Field(list())
166167
instances: Optional[List[AnnotationInstance]] = Field(list())
167-
Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
from typing import List
22
from typing import Optional
3+
from typing import Union
34

45
from superannotate_schemas.schemas.base import BaseAttribute
5-
from superannotate_schemas.schemas.base import BaseInstance
6+
from superannotate_schemas.schemas.enums import DocumentAnnotationTypeEnum
7+
from superannotate_schemas.schemas.base import BaseDocumentInstance
8+
from superannotate_schemas.schemas.base import INVALID_DICT_MESSAGE
69
from superannotate_schemas.schemas.base import BaseMetadata as Metadata
710
from superannotate_schemas.schemas.base import Tag
811
from superannotate_schemas.schemas.base import StrictInt
@@ -11,21 +14,70 @@
1114

1215
from pydantic import Field
1316
from pydantic import StrictStr
17+
from pydantic.error_wrappers import ErrorWrapper
18+
from pydantic import ValidationError
1419

1520

1621
class Attribute(BaseAttribute):
1722
id: StrictInt
1823
group_id: StrictInt = Field(None, alias="groupId")
1924

2025

21-
class DocumentInstance(BaseInstance):
26+
class EntityInstance(BaseDocumentInstance):
2227
start: int
2328
end: int
2429
attributes: Optional[List[Attribute]] = Field(list())
2530

2631

32+
class TagInstance(BaseDocumentInstance):
33+
attributes: Optional[List[Attribute]] = Field(list())
34+
35+
36+
class DocumentInstance(BaseDocumentInstance):
37+
pass
38+
39+
40+
ANNOTATION_TYPES = {
41+
DocumentAnnotationTypeEnum.ENTITY: EntityInstance,
42+
DocumentAnnotationTypeEnum.TAG: TagInstance,
43+
}
44+
45+
46+
class AnnotationInstance(BaseModel):
47+
__root__: Union[TagInstance, EntityInstance]
48+
49+
@classmethod
50+
def __get_validators__(cls):
51+
yield cls.return_action
52+
53+
@classmethod
54+
def return_action(cls, values):
55+
try:
56+
try:
57+
instance_type = values["type"]
58+
except KeyError:
59+
raise ValidationError(
60+
[ErrorWrapper(ValueError("field required"), "type")], cls
61+
)
62+
return ANNOTATION_TYPES[instance_type](**values)
63+
except KeyError:
64+
raise ValidationError(
65+
[
66+
ErrorWrapper(
67+
ValueError(
68+
f"invalid type, valid types are {', '.join(ANNOTATION_TYPES.keys())}"
69+
),
70+
"type",
71+
)
72+
],
73+
cls,
74+
)
75+
except TypeError as e:
76+
raise TypeError(INVALID_DICT_MESSAGE) from e
77+
78+
2779
class DocumentAnnotation(BaseModel):
2880
metadata: Metadata
29-
instances: Optional[List[DocumentInstance]] = Field(list())
81+
instances: Optional[List[AnnotationInstance]] = Field(list())
3082
tags: Optional[List[Tag]] = Field(list())
3183
free_text: Optional[StrictStr] = Field(None, alias="freeText")

src/superannotate_schemas/schemas/internal/vector.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from typing import List
2+
from typing import Any
23
from typing import Optional
34
from typing import Union
45

@@ -50,6 +51,7 @@ class PolyLine(VectorInstance):
5051

5152
class Polygon(VectorInstance):
5253
points: conlist(Union[StrictFloat, StrictInt], min_items=3)
54+
exclude: Optional[List[List[Union[StrictFloat, StrictInt]]]] = []
5355

5456

5557
class Bbox(VectorInstance):

src/superannotate_schemas/schemas/utils.py

Whitespace-only changes.

0 commit comments

Comments
 (0)