Skip to main content

Retejo

Функции

  • Валидация с помощью adaptix(и не только): Используйте библиотеку adaptix для парсинга ответов. Вы можете с легкостью заменить adaptix на pydantic.
  • Интуитивно понятный интерфейс: Полностью типизированный клиент упрощает процесс разработки, устроняя множество ошибок ещё до запуска кода.
  • Интеграции: Retejo поддерживает интеграцию со такими клиентами как: requests и aiohttp.

Установка

Вы можете установить retejo с помощью pip:

pip install retejo[requests, adaptix]
pip install retejo[aiohttp, adaptix]

или uv:

uv pip install retejo[requests, adaptix]
uv pip install retejo[aiohttp, adaptix]

Написание кода.

Для начала нужно объявить модель, например, dataclass.

@dataclass
class Post:
    id: int
    title: str
    body: str
    user_id: int

@dataclass
class PostId:
    id: int

Далее объявить метод.

В retejo каждый метод наследуется от базового класса Method. При наследовании в Method передается модель, которая описывает ответ метода.

Так же, нужно указать часть пусти к ендпоинту и тип метода.

class GetPost(Method[Post]):
    __url__ = "posts/{id}"
    __method__ = "get"

    id: UrlVar[int]

class CreatePost(Method[PostId]):
    __url__ = "posts"
    __method__ = "post"

    user_id: Body[int]
    title: Body[str]
    body: Body[str]

Теперь клиент. В super передаем базовую ссылку.

Так же переопределяем логику парсинга ответа. За большей информацией по adaptix обратитесь к его документации.

class Client(RequestsAdaptixClient):
    def __init__(self) -> None:
        super().__init__("https://jsonplaceholder.typicode.com/")

    @override
    def init_response_factory(self) -> Factory:
        return Retort(
            recipe=[
                # поля в ответе вида camelCase
                # будут конвертированы в lower_case.
                name_mapping(
                    name_style=NameStyle.CAMEL,
                ),
            ]
        )

Далее нужно привязать методы к клиенту. Для этого используется функция bind_method.

class Client(RequestsAdaptixClient):
    # ...
    get_post = bind_method(GetPost)
    create_post = bind_method(CreatePost)

Вы наверное подумаете, что из за этого не будет работать типизация. Наоборот, поведение будет как у метода, которая принимает аргументы для инициализации метода и возвращает ответ.

Например строка.

get_post = bind_method(GetPost)

Эквивалентно следующему.

def get_post(self, id: int) -> Post:
    return self.send_method(
        GetPost(
            id=id,
        ),
    )

Типизация работает на все 100%.

И, конечно же, использование клиента.

client = Client()
created_post = client.create_post(
    user_id=1,
    title="Title",
    body="Body"
)
got_post = client.get_post(created_post.id)
client.close()

Весь код.

@dataclass
class Post:
    id: int
    title: str
    body: str
    user_id: int

@dataclass
class PostId:
    id: int

class GetPost(Method[Post]):
    __url__ = "posts/{id}"
    __method__ = "get"

    id: UrlVar[int]

class CreatePost(Method[PostId]):
    __url__ = "posts"
    __method__ = "post"

    user_id: Body[int]
    title: Body[str]
    body: Body[str]


class Client(RequestsAdaptixClient):
    def __init__(self) -> None:
        super().__init__(base_url="https://jsonplaceholder.typicode.com/")

    @override
    def init_response_factory(self) -> Factory:
        return Retort(
            recipe=[
                name_mapping(name_style=NameStyle.CAMEL),
            ]
        )

    get_post = bind_method(GetPost)
    create_post = bind_method(CreatePost)


client = Client()
created_post = client.create_post(
    user_id=1,
    title="Title",
    body="Body"
)
got_post = client.get_post(created_post.id)
client.close()

Асинхронность.

Для того, чтобы использовать асинхронный подход, нужно:

  1. Установить retejo с aiohttp.

    pip install retejo[aiohttp, adaptix]
    
  2. Наследоваться от AiohttpAdaptixClient.

  3. Вызывать все методы клиента асинхронно.

    class Client(AiohttpAdaptixClient):
        def __init__(self) -> None:
            super().__init__(base_url="https://jsonplaceholder.typicode.com/")
    
    @override
    def init_response_factory(self) -> Factory:
        return Retort(
            recipe=[
                name_mapping(name_style=NameStyle.CAMEL),
            ]
        )
    
        get_post = bind_method(GetPost)
        create_post = bind_method(CreatePost)
    
    
    client = Client()
    created_post = await client.create_post(
        user_id=1,
        title="Title",
        body="Body"
    )
    got_post = await client.get_post(created_post.id)
    client.close()
    

Маркеры

Retejo предоставляет несколько базовых маркеров для ваших методов:

  • Body - параметр должен передано в тело запроса.

  • File - параметр является файлом.

  • Header - параметр должен передано в заголовки запроса.

  • QueryParam - параметр должен передано в параметры запроса.

  • UrlVar - параметр используется для форматирования ссылки.

  • Omittable - этот флаг комбинируется с выше перечисленными.

    Если значение параметра является объект Omitted, то это поле не попадет в запрос.

Пример использования.

class AddModel(Method[Any]):
    __url__ = "user/{user_id}/models"
    __method__ = "post"

    user_id: UrlVar[int]
    model: Body[str]
    access_token: Header[str]
    number: Body[Omittable[str]] = Omitted()


class Client(RequestsAdaptixClient):
    def __init__(self) -> None:
        super().__init__("")

    @override
    def init_markers_factories(self) -> MarkersFactorties:
        factories = super().init_markers_factories()
        factories[HeaderMarker] =  Retort(
            recipe=[
                dumper(
                    P[AddModel].access_token,
                    lambda x: f"Bearer {x}",
                ),
                name_mapping(
                    AddModel,
                    map={
                        "access_token": "Authorization",
                    },
                ),
            ],
        )
        return factories

    add_model = bind_method(AddModel)

Metadata

Release files for retejo 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for retejo 0.0.4
File Size Uploaded Provenance
retejo-0.0.4.tar.gz 29.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for retejo 0.0.4
File Interpreter ABI Platform
retejo-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 68.0 kB

Release files / retejo-0.0.4.tar.gz

Download URL retejo-0.0.4.tar.gz
Size 29.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d6f98d42adf9c5cbee9aca704c0cb906333e6e6be6e1a3d547da00f9f26c5f20
BLAKE2b-256 checksum
How to use checksums
c98f49b8668196e9bbd89525a16aa6db79a3f6344d0e0432a1d7b13d9fc0a419
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.3

Release files / retejo-0.0.4-py3-none-any.whl

Download URL retejo-0.0.4-py3-none-any.whl
Size 38.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
40cbcb760bb828baca26852ca129ee7e9da2e9c26c1bf8eed29e94e2da93e921
BLAKE2b-256 checksum
How to use checksums
f909cc9960d9aa0f53d719dadb3921b5f792f82074372939b35b325ac8be4859
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.7.3

Security for retejo 0.0.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page