Skip to content
Draft
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
6 changes: 6 additions & 0 deletions src/evidently/utils/litestar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
try:
from litestar.plugins.pydantic import PydanticSchemaPlugin
except ImportError:
from litestar.contrib.pydantic import PydanticSchemaPlugin

__all__ = ["PydanticSchemaPlugin"]
2 changes: 1 addition & 1 deletion src/evidently/utils/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import yaml
from litestar import get
from litestar._openapi.schema_generation import SchemaCreator
from litestar.contrib.pydantic import PydanticSchemaPlugin
from litestar.openapi.spec import Schema
from litestar.serialization import get_serializer
from litestar.typing import FieldDefinition
Expand All @@ -35,6 +34,7 @@
from evidently.ui.service.components.base import ComponentContext
from evidently.ui.service.datasets.filters import FilterBy
from evidently.ui.service.managers.base import replace_signature
from evidently.utils.litestar import PydanticSchemaPlugin


@no_type_check
Expand Down
68 changes: 68 additions & 0 deletions tests/utils/test_litestar.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import importlib.util
import sys
from pathlib import Path
from types import ModuleType


def _module(name: str, **attrs):
module = ModuleType(name)
module.__dict__.update(attrs)
return module


def _package(name: str, **attrs):
module = _module(name, **attrs)
module.__path__ = []
return module


def _clear_litestar_modules(monkeypatch):
for name in list(sys.modules):
if name == "litestar" or name.startswith("litestar."):
monkeypatch.delitem(sys.modules, name, raising=False)


def _load_compat_module():
path = Path(__file__).parents[2] / "src" / "evidently" / "utils" / "litestar.py"
spec = importlib.util.spec_from_file_location("evidently_litestar_compat_test", path)
assert spec is not None
assert spec.loader is not None
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module


def test_pydantic_schema_plugin_uses_current_litestar_import(monkeypatch):
plugin = type("CurrentPydanticSchemaPlugin", (), {})

_clear_litestar_modules(monkeypatch)
monkeypatch.setitem(sys.modules, "litestar", _package("litestar"))
monkeypatch.setitem(sys.modules, "litestar.plugins", _package("litestar.plugins"))
monkeypatch.setitem(
sys.modules,
"litestar.plugins.pydantic",
_module("litestar.plugins.pydantic", PydanticSchemaPlugin=plugin),
)
monkeypatch.delitem(sys.modules, "litestar.contrib.pydantic", raising=False)

module = _load_compat_module()

assert module.PydanticSchemaPlugin is plugin


def test_pydantic_schema_plugin_falls_back_to_deprecated_import(monkeypatch):
plugin = type("LegacyPydanticSchemaPlugin", (), {})

_clear_litestar_modules(monkeypatch)
monkeypatch.setitem(sys.modules, "litestar", _package("litestar"))
monkeypatch.setitem(sys.modules, "litestar.plugins", _package("litestar.plugins"))
monkeypatch.setitem(sys.modules, "litestar.contrib", _package("litestar.contrib"))
monkeypatch.setitem(
sys.modules,
"litestar.contrib.pydantic",
_module("litestar.contrib.pydantic", PydanticSchemaPlugin=plugin),
)

module = _load_compat_module()

assert module.PydanticSchemaPlugin is plugin