Подключить Adaptix#

Установите отдельный плагин:

uv add "eazy-sdk-core[adaptix]"

Перечислите типы, которыми управляет Retort, и повторите их таблицу имён для компилятора SDK:

# examples/docs/integration_adaptix_model.py
@dataclass(frozen=True, slots=True)
class Message:
    message_id: int
    subject: str


retort = Retort(recipe=[name_mapping(Message, map={"message_id": "id"})])
serialization = Serialization(
    models=adaptix_models(
        default_model_adapters(),
        retort=retort,
        types=(Message,),
        names={Message: {"message_id": "id"}},
    )
)


@dataclass(frozen=True, slots=True)
class GetMessage(HttpOperation[Message]):
    __http__ = Http.get("/messages/42")


class MessagesApi(SyncApi):
    get = op(GetMessage)
Файл целиком
"""Route one dataclass model through an application Adaptix retort."""

from __future__ import annotations

from dataclasses import dataclass

from adaptix import Retort, name_mapping
from eazy_sdk_adaptix import adaptix_models

from eazy_sdk import Http, HttpOperation, SyncApi, op
from eazy_sdk.models import default_model_adapters
from eazy_sdk.serialization import Serialization

from .guide_site import GuideSite, guide_client


# docs:integration-adaptix-model:start
# examples/docs/integration_adaptix_model.py
@dataclass(frozen=True, slots=True)
class Message:
    message_id: int
    subject: str


retort = Retort(recipe=[name_mapping(Message, map={"message_id": "id"})])
serialization = Serialization(
    models=adaptix_models(
        default_model_adapters(),
        retort=retort,
        types=(Message,),
        names={Message: {"message_id": "id"}},
    )
)


@dataclass(frozen=True, slots=True)
class GetMessage(HttpOperation[Message]):
    __http__ = Http.get("/messages/42")


class MessagesApi(SyncApi):
    get = op(GetMessage)
# docs:integration-adaptix-model:end


def main() -> None:
    with guide_client(GuideSite()) as client:
        message = MessagesApi(client, serialization=serialization).get()
    print(f"adaptix: {message.message_id} {message.subject}")


if __name__ == "__main__":
    main()
adaptix: 42 План на пятницу

adaptix_models(...) заменяет штатный адаптер dataclass одним маршрутизатором. Указанные в types= классы проходят через Retort; остальные dataclass продолжает обрабатывать встроенная реализация. Так в реестре не появляются два адаптера для одного типа.

Таблица names= нужна компилятору до первого значения модели. Она должна совпадать с name_mapping в рецепте Retort.

Дальше#