Skip to content

Commit e1dbb8e

Browse files
authored
Merge pull request #17 from superannotateai/develop
Develop
2 parents ae6639d + e48b30e commit e1dbb8e

File tree

11 files changed

+472
-238
lines changed

11 files changed

+472
-238
lines changed

dev_requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
pytest==6.2.4
33
pytest-xdist==2.3.0
44
pytest-parallel==0.1.0
5-
pytest-rerunfailures==10.2
5+
pytest-rerunfailures==10.2

src/superannotate_schemas/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from superannotate_schemas.validators import AnnotationValidators
88

99

10-
__version__ = '1.0.39'
10+
__version__ = '1.0.40'
11+
1112

1213
__all__ = [
1314
"__version__",

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: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,83 @@
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+
class_name: NotEmptyStr = Field(alias="className")
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+
2679
class DocumentAnnotation(BaseModel):
2780
metadata: Metadata
28-
instances: Optional[List[DocumentInstance]] = Field(list())
81+
instances: Optional[List[AnnotationInstance]] = Field(list())
2982
tags: Optional[List[Tag]] = Field(list())
3083
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)