Skip to content
Open
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ dependencies = [
"scipy>=1.10.0",
"requests>=2.32.0",
"PyYAML>=6.0.1",
"pydantic>=1.10.16",
"pydantic>=2.10",
"litestar>=2.19.0",
"typing-inspect>=0.9.0",
"uvicorn[standard]>=0.22.0",
Expand Down
2 changes: 1 addition & 1 deletion requirements.min.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ nltk==3.6.7
scipy==1.10.0
requests==2.32.0
PyYAML==6.0.1
pydantic==1.10.16
pydantic==2.10
litestar==2.19.0
typing-inspect==0.9.0
uvicorn==0.22.0
Expand Down
94 changes: 0 additions & 94 deletions src/evidently/_pydantic_compat.py

This file was deleted.

7 changes: 4 additions & 3 deletions src/evidently/cli/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
from typing import TypeVar
from typing import Union

from pydantic import BaseModel
from pydantic import TypeAdapter

from evidently import Dataset
from evidently._pydantic_compat import BaseModel
from evidently._pydantic_compat import parse_obj_as
from evidently.core.report import Snapshot
from evidently.legacy.ui.type_aliases import DatasetID
from evidently.legacy.ui.type_aliases import ProjectID
Expand Down Expand Up @@ -92,7 +93,7 @@ class _Config(BaseModel):
@classmethod
def load(cls: Type[T], path: str) -> "T":
with open(path) as f:
return parse_obj_as(cls, json.load(f))
return TypeAdapter(cls).validate_python(json.load(f))

def save(self, path: str) -> None:
with open(path, "w") as f:
Expand Down
20 changes: 18 additions & 2 deletions src/evidently/core/base_types.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
import math
from typing import Annotated
from typing import Union

from evidently._pydantic_compat import StrictBool
from pydantic import BeforeValidator
from pydantic import StrictBool

Label = Union[StrictBool, int, str, None]

def label_validator(value):
if isinstance(value, bool):
return value
if isinstance(value, int):
return value
if isinstance(value, str):
return value
if isinstance(value, float) and math.isnan(value):
return "nan"
return value


Label = Annotated[Union[StrictBool, int, str, float, None], BeforeValidator(label_validator)]
3 changes: 1 addition & 2 deletions src/evidently/core/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ class MetricContainer(AutoAliasMixin, EvidentlyBaseModel, abc.ABC):

__alias_type__: ClassVar[str] = "metric_container"

class Config:
is_base_type = True
__is_base_type__: ClassVar[bool] = True

include_tests: bool = True
"""Whether to include default tests for generated metrics."""
Expand Down
21 changes: 11 additions & 10 deletions src/evidently/core/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@

import numpy as np
import pandas as pd
from pydantic import BaseModel
from pydantic import TypeAdapter

from evidently._pydantic_compat import BaseModel
from evidently._pydantic_compat import parse_obj_as
from evidently.core.base_types import Label
from evidently.core.tests import GenericTest
from evidently.legacy.base_metric import DisplayName
Expand Down Expand Up @@ -321,8 +321,7 @@ class SpecialColumnInfo(AutoAliasMixin, EvidentlyBaseModel):
__alias_type__: ClassVar = "special_column_info"
"""Alias type for serialization."""

class Config:
is_base_type = True
__is_base_type__: ClassVar[bool] = True

def get_metrics(self) -> List["MetricOrContainer"]:
"""Get metrics associated with this special column.
Expand Down Expand Up @@ -659,8 +658,7 @@ class ColumnCondition(AutoAliasMixin, EvidentlyBaseModel, abc.ABC):
__alias_type__: ClassVar[str] = "column_condition"
"""Alias type for serialization."""

class Config:
is_base_type = True
__is_base_type__: ClassVar[bool] = True

@abstractmethod
def check(self, value: Any) -> bool:
Expand Down Expand Up @@ -738,8 +736,7 @@ class Descriptor(AutoAliasMixin, EvidentlyBaseModel, abc.ABC):
computed features for evaluation.
"""

class Config:
is_base_type = True
__is_base_type__: ClassVar[bool] = True

__alias_type__: ClassVar = "descriptor_v2"
"""Alias type for serialization."""
Expand Down Expand Up @@ -822,7 +819,7 @@ def __init__(
) -> None:
self.column = column
if isinstance(condition, dict):
condition = parse_obj_as(ColumnCondition, condition) # type: ignore[type-abstract]
condition = TypeAdapter(ColumnCondition).validate_python(condition) # type: ignore[type-abstract]
descriptor_condition: ColumnCondition = (
condition if isinstance(condition, ColumnCondition) else condition.for_descriptor().condition
)
Expand Down Expand Up @@ -1082,7 +1079,11 @@ def __init__(
self, feature: GeneratedFeatures, alias: Optional[str] = None, tests: Optional[List[AnyDescriptorTest]] = None
):
# this is needed because we try to access it before super call
feature = feature if isinstance(feature, GeneratedFeatures) else parse_obj_as(GeneratedFeatures, feature) # type: ignore[type-abstract]
feature = (
feature
if isinstance(feature, GeneratedFeatures)
else TypeAdapter(GeneratedFeatures).validate_python(feature)
) # type: ignore[type-abstract]
feature_columns = feature.list_columns()
super().__init__(feature=feature, alias=alias or f"{feature_columns[0].display_name}", tests=tests)

Expand Down
Loading
Loading