Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dev_requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
pytest==6.2.4
pytest-xdist==2.3.0
pytest-parallel==0.1.0
pytest-rerunfailures==10.2
pytest-rerunfailures==10.2
3 changes: 2 additions & 1 deletion src/superannotate_schemas/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
from superannotate_schemas.validators import AnnotationValidators


__version__ = '1.0.39'
__version__ = '1.0.40'


__all__ = [
"__version__",
Expand Down
5 changes: 5 additions & 0 deletions src/superannotate_schemas/schemas/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from superannotate_schemas.schemas.enums import VectorAnnotationTypeEnum
from superannotate_schemas.schemas.enums import AnnotationStatusEnum
from superannotate_schemas.schemas.enums import ClassTypeEnum
from superannotate_schemas.schemas.enums import DocumentAnnotationTypeEnum
from superannotate_schemas.schemas.constances import DATE_REGEX
from superannotate_schemas.schemas.constances import DATE_TIME_FORMAT_ERROR_MESSAGE
from superannotate_schemas.schemas.constances import POINT_LABEL_VALUE_FORMAT_ERROR_MESSAGE
Expand Down Expand Up @@ -239,6 +240,10 @@ class BaseVectorInstance(BaseImageAnnotationInstance):
group_id: Optional[int] = Field(alias="groupId")


class BaseDocumentInstance(BaseInstance):
type: DocumentAnnotationTypeEnum


class HexColor(BaseModel):
__root__: ColorType

Expand Down
5 changes: 5 additions & 0 deletions src/superannotate_schemas/schemas/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ class VectorAnnotationTypeEnum(str, Enum):
TAG = "tag"


class DocumentAnnotationTypeEnum(str, Enum):
ENTITY = "entity"
TAG = "tag"


class CreationTypeEnum(str, Enum):
MANUAL = "Manual"
PREDICTION = "Prediction"
Expand Down
69 changes: 61 additions & 8 deletions src/superannotate_schemas/schemas/external/document.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,83 @@
from typing import List
from typing import Optional
from typing import Union

from pydantic import Field
from pydantic import StrictStr
from pydantic import ValidationError
from pydantic.error_wrappers import ErrorWrapper

from superannotate_schemas.schemas.base import BaseAttribute
from superannotate_schemas.schemas.base import BaseInstance
from superannotate_schemas.schemas.base import BaseDocumentInstance
from superannotate_schemas.schemas.base import BaseMetadata as Metadata
from superannotate_schemas.schemas.base import Tag
from superannotate_schemas.schemas.base import NotEmptyStr

from superannotate_schemas.schemas.base import BaseModel
from pydantic import Field
from pydantic import StrictStr
from superannotate_schemas.schemas.base import INVALID_DICT_MESSAGE
from superannotate_schemas.schemas.base import NotEmptyStr
from superannotate_schemas.schemas.base import Tag
from superannotate_schemas.schemas.enums import DocumentAnnotationTypeEnum


class Attribute(BaseAttribute):
name: NotEmptyStr
group_name: NotEmptyStr = Field(alias="groupName")


class DocumentInstance(BaseInstance):
class EntityInstance(BaseDocumentInstance):
start: int
end: int
attributes: Optional[List[Attribute]] = Field(list())


class TagInstance(BaseDocumentInstance):
attributes: Optional[List[Attribute]] = Field(list())
class_name: NotEmptyStr = Field(alias="className")


class DocumentInstance(BaseDocumentInstance):
pass


ANNOTATION_TYPES = {
DocumentAnnotationTypeEnum.ENTITY: EntityInstance,
DocumentAnnotationTypeEnum.TAG: TagInstance,
}


class AnnotationInstance(BaseModel):
__root__: Union[TagInstance, EntityInstance]

@classmethod
def __get_validators__(cls):
yield cls.return_action

@classmethod
def return_action(cls, values):
try:
try:
instance_type = values["type"]
except KeyError:
raise ValidationError(
[ErrorWrapper(ValueError("field required"), "type")], cls
)
return ANNOTATION_TYPES[instance_type](**values)
except KeyError:
raise ValidationError(
[
ErrorWrapper(
ValueError(
f"invalid type, valid types are {', '.join(ANNOTATION_TYPES.keys())}"
),
"type",
)
],
cls,
)
except TypeError as e:
raise TypeError(INVALID_DICT_MESSAGE) from e


class DocumentAnnotation(BaseModel):
metadata: Metadata
instances: Optional[List[DocumentInstance]] = Field(list())
instances: Optional[List[AnnotationInstance]] = Field(list())
tags: Optional[List[Tag]] = Field(list())
free_text: Optional[StrictStr] = Field(None, alias="freeText")
2 changes: 1 addition & 1 deletion src/superannotate_schemas/schemas/external/vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class PolyLine(VectorInstance):

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


class Bbox(VectorInstance):
Expand Down Expand Up @@ -164,4 +165,3 @@ class VectorAnnotation(BaseModel):
comments: Optional[List[Comment]] = Field(list())
tags: Optional[List[Tag]] = Field(list())
instances: Optional[List[AnnotationInstance]] = Field(list())

58 changes: 55 additions & 3 deletions src/superannotate_schemas/schemas/internal/document.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from typing import List
from typing import Optional
from typing import Union

from superannotate_schemas.schemas.base import BaseAttribute
from superannotate_schemas.schemas.base import BaseInstance
from superannotate_schemas.schemas.enums import DocumentAnnotationTypeEnum
from superannotate_schemas.schemas.base import BaseDocumentInstance
from superannotate_schemas.schemas.base import INVALID_DICT_MESSAGE
from superannotate_schemas.schemas.base import BaseMetadata as Metadata
from superannotate_schemas.schemas.base import Tag
from superannotate_schemas.schemas.base import StrictInt
Expand All @@ -11,21 +14,70 @@

from pydantic import Field
from pydantic import StrictStr
from pydantic.error_wrappers import ErrorWrapper
from pydantic import ValidationError


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


class DocumentInstance(BaseInstance):
class EntityInstance(BaseDocumentInstance):
start: int
end: int
attributes: Optional[List[Attribute]] = Field(list())


class TagInstance(BaseDocumentInstance):
attributes: Optional[List[Attribute]] = Field(list())


class DocumentInstance(BaseDocumentInstance):
pass


ANNOTATION_TYPES = {
DocumentAnnotationTypeEnum.ENTITY: EntityInstance,
DocumentAnnotationTypeEnum.TAG: TagInstance,
}


class AnnotationInstance(BaseModel):
__root__: Union[TagInstance, EntityInstance]

@classmethod
def __get_validators__(cls):
yield cls.return_action

@classmethod
def return_action(cls, values):
try:
try:
instance_type = values["type"]
except KeyError:
raise ValidationError(
[ErrorWrapper(ValueError("field required"), "type")], cls
)
return ANNOTATION_TYPES[instance_type](**values)
except KeyError:
raise ValidationError(
[
ErrorWrapper(
ValueError(
f"invalid type, valid types are {', '.join(ANNOTATION_TYPES.keys())}"
),
"type",
)
],
cls,
)
except TypeError as e:
raise TypeError(INVALID_DICT_MESSAGE) from e


class DocumentAnnotation(BaseModel):
metadata: Metadata
instances: Optional[List[DocumentInstance]] = Field(list())
instances: Optional[List[AnnotationInstance]] = Field(list())
tags: Optional[List[Tag]] = Field(list())
free_text: Optional[StrictStr] = Field(None, alias="freeText")
2 changes: 2 additions & 0 deletions src/superannotate_schemas/schemas/internal/vector.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from typing import List
from typing import Any
from typing import Optional
from typing import Union

Expand Down Expand Up @@ -50,6 +51,7 @@ class PolyLine(VectorInstance):

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


class Bbox(VectorInstance):
Expand Down
Empty file.
Loading