Skip to content

Commit f6384e6

Browse files
committed
Revert "Upgrade pydantic to v2"
This reverts commit f41d1e6.
1 parent f41d1e6 commit f6384e6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+663
-1017
lines changed

requirements.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
pydantic>=2.5,<3
2-
pydantic-extra-types>=2.0
1+
pydantic>=1.10,<3,!=2.0.*
32
aiohttp~=3.8
43
boto3~=1.26
54
opencv-python-headless~=4.7
65
plotly~=5.14
7-
pandas~=2.2
6+
pandas~=2.0
87
pillow~=12.1
98
tqdm~=4.66
109
requests==2.*

src/superannotate/lib/app/interface/base_interface.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,17 @@
99
from pathlib import Path
1010
from types import FunctionType
1111
from typing import Iterable
12-
from typing import Optional
1312
from typing import Sized
1413

15-
from pydantic import ValidationError
16-
1714
import lib.core as constants
1815
from lib.app.interface.types import validate_arguments
1916
from lib.core import CONFIG
2017
from lib.core import setup_logging
2118
from lib.core.entities.base import ConfigEntity
2219
from lib.core.entities.base import TokenStr
2320
from lib.core.exceptions import AppException
21+
from lib.core.pydantic_v1 import ErrorWrapper
22+
from lib.core.pydantic_v1 import ValidationError
2423
from lib.infrastructure.controller import Controller
2524
from lib.infrastructure.utils import extract_project_folder_inputs
2625
from lib.infrastructure.validators import wrap_error
@@ -31,7 +30,7 @@ class BaseInterfaceFacade:
3130
REGISTRY = []
3231

3332
@validate_arguments
34-
def __init__(self, token: Optional[TokenStr] = None, config_path: Optional[str] = None):
33+
def __init__(self, token: TokenStr = None, config_path: str = None):
3534
try:
3635
if token:
3736
config = ConfigEntity(SA_TOKEN=token)
@@ -81,7 +80,10 @@ def _retrieve_configs_from_json(path: Path) -> typing.Union[ConfigEntity]:
8180
try:
8281
config = ConfigEntity(SA_TOKEN=token)
8382
except ValidationError:
84-
raise AppException("Invalid token.")
83+
raise ValidationError(
84+
[ErrorWrapper(ValueError("Invalid token."), loc="token")],
85+
model=ConfigEntity,
86+
)
8587
host = json_data.get("main_endpoint")
8688
verify_ssl = json_data.get("ssl_verify")
8789
if host:

src/superannotate/lib/app/interface/sdk_interface.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,26 +56,20 @@
5656
from lib.core.entities.integrations import IntegrationTypeEnum
5757
from lib.core.enums import ImageQuality
5858
from lib.core.enums import CustomFieldEntityEnum
59-
from pydantic import TypeAdapter
60-
from pydantic import ValidationError
61-
6259
from lib.core.enums import ProjectType
6360
from lib.core.enums import ClassTypeEnum
6461
from lib.core.exceptions import AppException
65-
from lib.core.pydantic_v1 import constr
66-
from lib.core.pydantic_v1 import conlist
6762
from lib.core.types import PriorityScoreEntity
6863
from lib.core.types import Project
64+
from lib.core.pydantic_v1 import ValidationError
65+
from lib.core.pydantic_v1 import constr
66+
from lib.core.pydantic_v1 import conlist
67+
from lib.core.pydantic_v1 import parse_obj_as
6968
from lib.infrastructure.annotation_adapter import BaseMultimodalAnnotationAdapter
7069
from lib.infrastructure.annotation_adapter import MultimodalSmallAnnotationAdapter
7170
from lib.infrastructure.annotation_adapter import MultimodalLargeAnnotationAdapter
7271
from lib.infrastructure.utils import extract_project_folder
7372
from lib.infrastructure.validators import wrap_error
74-
75-
76-
def parse_obj_as(type_, obj):
77-
"""Compatibility function for pydantic v1 parse_obj_as."""
78-
return TypeAdapter(type_).validate_python(obj)
7973
from lib.app.serializers import WMProjectSerializer
8074
from lib.core.entities.work_managament import WMUserTypeEnum
8175
from lib.core.jsx_conditions import EmptyQuery
@@ -1881,7 +1875,7 @@ def get_project_settings(self, project: Union[NotEmptyStr, dict]):
18811875
project = self.controller.projects.get_by_name(project_name).data
18821876
settings = self.controller.projects.list_settings(project).data
18831877
settings = [
1884-
SettingsSerializer(attribute.model_dump()).serialize() for attribute in settings
1878+
SettingsSerializer(attribute.dict()).serialize() for attribute in settings
18851879
]
18861880
return settings
18871881

@@ -2827,7 +2821,7 @@ def create_annotation_class(
28272821
"""
28282822

28292823
attribute_groups = (
2830-
list(map(lambda x: x.model_dump(), attribute_groups)) if attribute_groups else []
2824+
list(map(lambda x: x.dict(), attribute_groups)) if attribute_groups else []
28312825
)
28322826
try:
28332827
annotation_class = AnnotationClassEntity(

src/superannotate/lib/app/interface/types.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import re
21
from functools import wraps
3-
from typing import Annotated
42
from typing import Union
53

6-
from pydantic import AfterValidator
7-
from pydantic import StrictStr
8-
from pydantic import validate_call
9-
from pydantic import ValidationError
10-
114
from lib.core.enums import BaseTitledEnum
125
from lib.core.exceptions import AppException
6+
from lib.core.pydantic_v1 import constr
137
from lib.core.pydantic_v1 import errors
8+
from lib.core.pydantic_v1 import pydantic_validate_arguments
149
from lib.core.pydantic_v1 import PydanticTypeError
10+
from lib.core.pydantic_v1 import StrictStr
11+
from lib.core.pydantic_v1 import StrRegexError
12+
from lib.core.pydantic_v1 import ValidationError
1513
from lib.infrastructure.validators import wrap_error
1614

1715

@@ -30,31 +28,27 @@ def __str__(self) -> str:
3028
errors.EnumMemberError = EnumMemberError
3129

3230

33-
# Email validation pattern
34-
_EMAIL_PATTERN = re.compile(
35-
r"^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)"
36-
r"*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}"
37-
r"[a-zA-Z0-9])?)*$"
38-
)
39-
40-
41-
def _validate_email(value: str) -> str:
42-
"""Validate email format."""
43-
if not _EMAIL_PATTERN.match(value):
44-
raise ValueError("Invalid email")
45-
return value
46-
47-
48-
EmailStr = Annotated[StrictStr, AfterValidator(_validate_email)]
31+
class EmailStr(StrictStr):
32+
@classmethod
33+
def validate(cls, value: Union[str]) -> Union[str]:
34+
try:
35+
constr(
36+
regex=r"^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)"
37+
r"*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}"
38+
r"[a-zA-Z0-9])?)*$"
39+
).validate( # noqa
40+
value
41+
)
42+
except StrRegexError:
43+
raise ValueError("Invalid email")
44+
return value
4945

5046

5147
def validate_arguments(func):
52-
validated_func = validate_call(func)
53-
5448
@wraps(func)
5549
def wrapped(self, *args, **kwargs):
5650
try:
57-
return validated_func(self, *args, **kwargs)
51+
return pydantic_validate_arguments(func)(self, *args, **kwargs)
5852
except ValidationError as e:
5953
raise AppException(wrap_error(e)) from e
6054

src/superannotate/lib/app/serializers.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
from typing import Set
55
from typing import Union
66

7-
from pydantic import BaseModel
8-
97
import lib.core as constance
108
from lib.core.entities import BaseEntity
9+
from lib.core.pydantic_v1 import BaseModel
1110

1211

1312
class BaseSerializer:
@@ -59,16 +58,16 @@ def _serialize(
5958
if fields:
6059
if len(fields) == 1:
6160
if flat:
62-
return entity.model_dump(
61+
return entity.dict(
6362
include=fields, by_alias=by_alias, exclude=exclude, **kwargs
6463
)[next(iter(fields))]
65-
return entity.model_dump(
64+
return entity.dict(
6665
include=fields, by_alias=by_alias, exclude=exclude, **kwargs
6766
)
68-
return entity.model_dump(
67+
return entity.dict(
6968
include=fields, by_alias=by_alias, exclude=exclude, **kwargs
7069
)
71-
return entity.model_dump(by_alias=by_alias, exclude=exclude, **kwargs)
70+
return entity.dict(by_alias=by_alias, exclude=exclude, **kwargs)
7271
return entity.to_dict()
7372

7473
@classmethod
@@ -116,7 +115,7 @@ def serialize(
116115
to_exclude[field] = True
117116
if self._entity.classes:
118117
self._entity.classes = [
119-
i.model_dump(by_alias=True, exclude_unset=True) for i in self._entity.classes
118+
i.dict(by_alias=True, exclude_unset=True) for i in self._entity.classes
120119
]
121120
data = super().serialize(fields, by_alias, flat, to_exclude)
122121
if data.get("settings"):
@@ -194,4 +193,4 @@ def serialize(
194193
nested_model, "fill_enum_values", False
195194
):
196195
setattr(data, key, cls.serialize(nested_model, **kwargs))
197-
return data.model_dump(**kwargs)
196+
return data.dict(**kwargs)

0 commit comments

Comments
 (0)