Перейти к содержанию

CHANGELOG

2023-07-03 0.1.5.0 NastJS

В этом обновлении добавлена и протестирована полная поддержка NATS JetStream - персистентного слоя NATS.

Теперь вы можете работать с этим великолепным брокером, не боясь потери сообщений, используя механизм подтверждения получения, а также встроенные key-value и object хранилища.

Также, в этом обновлении были изменены некоторые внутренние классы для дальнейшего создания на их основе синхронных интерфейсов.

2023-06-26 0.1.4.0 PydanticV2

Основное изменение в этом обновлении - поддержка бета-версии PydanticV2.

Также, это обновление работает и с PydanticV1, поэтому, если ваше приложение перестает функционировать при миграции на новую версию Pydantic, вы можете просто откатить его обратно - Propan продолжит работать без изменений.

Будьте внимательны: если вы используете Propan вместе с FastAPI при миграции на PydanticV2 вы должны установить версию fastapi>=0.100.0b1, которая также совместима с обоими версиями Pydantic. Однако, если вы работаете на версиях FastAPI 0.9*, текущий релиз совместим и с ними (но только с использованием PydanticV1).

Все тестовые сценарии корректно отрабатывают со всеми вариациями вышеописанных зависимостей и на всех поддерживаемых версиях Python.

Другие изменения:

Улучшена совместимость с FastAPI:

  • PropanRouter поддерживает зависимости верхнего уровня
    from propan.fastapi import RabbitRouter
    
    router = RabbitRouter(dependencies=[...])
    @router.event("test", dependencies=[...])
    async def handler(a: str, b: int):
        ...
    
  • Вы можете тестировать router.event с помощью build_message напрямую
    import pytest, pydantic
    from propan.fastapi import RabbitRouter
    from propan.test.rabbit import build_message
    
    router = RabbitRouter()
    
    @router.event("test")
    async def handler(a: str, b: int):
        ...
    
    with pytest.raises(pydantic.ValidationError):
        handler(build_message("Hello", "test"), reraise_exc=True)
    

Реализован BrokerRouter для удобства разделения кода приложения на импортируемые подмодули.

from propan import RabbitBroker, RabbitRouter

router = RabbitRouter(prefix="user/")

@router.handle("created")
async def handle_user_created_event(user_id: str):
    ...

broker = RabbitBroker()
broker.include_router(router)

Добавлен раздел документации про кастомные сценарии сериализации сообщений (на примере Protobuf).

А также обновлены несколько других разделов документации, исправлен ряд некритических багов, удалены RabbitBroker deprecated методы, увеличено тестовое покрытие редких сценариев.


2023-06-14 0.1.3.0 AsyncAPI

Текущее обновление добавляет функционал, над которым я усердно работал последний месяц: теперь Propan может автоматически генерировать и хостить документацию для вашего приложения в соответствии со спецификацией AsyncAPI.

Вы можете просто предоставить смежным командам ссылку на страницу с вашей документацией, где они смогут ознакомиться со всеми параметрами используемого сервера, каналов и форматом сообщений, потребляемых вашим сервисом.

HTML-page

Подробнее с этим функционалом вы можете ознакомиться в соответсвующем разделе документации.

Также, добавлена возможность определения зависимостей уровня брокера и потребителей:

from propan import RabbitBroker, Depends

broker = RabbitBroker(dependencies=[Depends(...)])

@broker.handler(..., dependencies=[Depends(...)])
async def handler():
    ...

2023-06-13 0.1.2.17

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

Основное изменение - Propan больше не обязывает вас получать сообщение только в виде одного аргумента. Ваша функция-обработчик может потреблять столько аргументов, сколько необходимо, а также комбинировать их с pydantic.BaseModel.

@router.handle(...)
async def handler(a: int, b: float):
...
async def handler(a: Message, b: float, c: str):

В RabbitBroker добавлены публичные методы для объявления объектов RabbitMQ:

broker = RabbitBroker()
...
   await broker.declare_exchange(RabbitExchange("test"))
   await broker.declare_queue(RabbitQueue("test"))
   channel: aio_pika.RobustChannel = broker.channel

Для поддержания возможности отправки сообщений и инициализации каналов во все FastAPI PropanRouters добавлен after_startup хук.

router = RabbitRouter()

@router.after_startup
async def init_whatever(app: FastAPI): ...

Кроме этого, улучшено поведение методов __init__ и connect у всех брокеров (теперь параметры connect имеют приоритет и переопределяют параметры __init__ при подключении к брокеру), реализовано корректное исключение при обращении к недоступному для импортирования объекту, исправлено несколько ошибок и произведены другие мелкие внутренние изменения.


2023-05-28 0.1.2.3 SQS Beta

В Propan добавлена поддержка SQS в качестве брокера сообщений. Данный функционал полностью протестирован.

SQSBroker поддерживает:

  • доставку сообщений
  • тестовый клиент, без необходимости запуска ElasticMQ или подключения к облачному SQS
  • FastAPI плагин

KafkaBroker на данный момент не поддерживает RPC запросы.

Также текущий релиз включает следующие исправления:

  • автоматическое восстановления соединения с Kafka
  • автоматическое восстановления соединения с Nats
  • Redis поддерживает подключение по явным аргументам

2023-05-26 0.1.2.2 NATS Stable

NatsBroker полностью протестирован.

Также для Nats добавлены:

  • Тестовый клиент и тестовые сообщения
  • Поддержка RPC
  • NatsRouter для использования с FastAPI

2023-05-23 0.1.2.0 Kafka

В Propan добавлена поддержка Kafka в качестве брокера сообщений. Данный функционал полностью протестирован.

KafkaBroker поддерживает:

  • доставку сообщений
  • тестовый клиент, без необходимости запуска Kafka
  • В качестве плагина FastAPI

KafkaBroker на данный момент не поддерживает RPC запросы.


2023-05-18 0.1.1.0 REDIS

В Propan добавлена поддержка Redis Pub/Sub в качестве брокера сообщений. Данный функционал полностью протестирован и описан в документации.

RedisBroker поддерживает:

  • доставку сообщений по ключу или паттерну
  • тестовый клиент, без необходимости запуска Redis
  • RPC запросы поверх Redis Pub/Sub
  • В качестве плагина FastAPI

Также, Propan CLI теперь позволяет генерировать шаблоны проектов для использования с различными брокерами сообщений

propan create async [broker] [APPNAME]

2023-05-15 0.1.0.0 STABLE

Стабильный и полностью задокументированный релиз Propan!

С текущего релиза больше не предвидется изменений, нарушающих обратную совместимость - используйте фреймворк смело!

На данный момент поддерживаются, протестированы и описаны в документации все варианты взаимодействия с RabbitMQ. В скором времени ожидайте поддержку Redis (находится в тестировании сейчас), Kafka (находится в разработке) и полную поддержку Nats (также в разработке).


2023-05-01 0.0.9.4

Отличные новости! Теперь Propan можно использовать как полноценную часть FastAPI!

from fastapi import FastAPI
from propan.fastapi import RabbitRouter

router = RabbitRouter("amqp://guest:guest@localhost:5672")

app = FastAPI(lifespan=router.lifespan_context)

@router.event("test")
async def hello(m: dict) -> dict:
    return { "response": "Hello, Propan!" }

app.include_router(router)

Полный пример вы можете найти в документации

Также, добавлена возможность тестировать свое приложение без запуска внешних зависимостей в виде брокера (пока только для RabbitMQ)!

from propan import RabbitBroker
from propan.test import TestRabbitBroker

broker = RabbitBroker()

@broker.handler("ping")
async def healthcheck(msg: str) -> str:
    return "pong"

async def test_publish():
    async with TestRabbitBroker(broker) as test_broker:
        await test_broker.start()
        r = await test_broker.publish("ping", queue="ping", callback=True)
    assert r == "pong"

Также добавлена поддержка RPC over MQ (пока только для RabbitMQ): return вашей функции-обработчика будет отправлен в ответ на сообщение, если ответ ожидается.

Breaking changes:

  • метод брокеров publish_message был переименован в publish
  • удален аргумент declare в RabbitQueue и RabbitExchange - теперь необходимо использовать passive

2023-04-18 0.0.9

Релиз приурочен к выходу в свет другой библиотеки: fast-depends. Теперь Propan используется ее в качестве системы управления зависимостями. Context также переосмыслен - теперь это наследник fast-depends CustomField.

Особенности сборки:

  • Вложенность Depends
  • Более гибкое поведение Context
  • Полностью протестированная и стабильная система управления зависимостями
  • Добавлен модуль propan.annotation для быстрого доступа к уже существующим объектам контекста

Breaking changes:

  • @use_context был удален. Используйте @apply_types для внедрения Context
  • Alias был перемещен как часть Context
  • Доступ к объектам контекста больше нельзя получить просто объявив аргумент функции

Теперь нужно использовать следующий код:

from propan import Context, apply_types
@apply_types
def func(logger = Context()): ...

# or
from propan import Context, apply_types
@apply_types
def func(l = Context("logger")): ...

# or
from propan import apply_types
from propan.annotations import Logger
@apply_types
def func(logger: Logger): ...

2023-04-05 INITIAL

Привет! Поздравляю всех и, особенно, себя с первым стабильным релизом Propan!

Особенности сборки

Стабильныe

  • async RabbitMQ broker
  • инъекция зависимостей
  • преобразование типов
  • инструмент CLI

Экспериментальные

В релиз добавлена первая реализация поддержки NATS (без использования Jetstream).

Следующие шаги

  • Полная поддержка NATS
  • Синхронная версия брокеров и приложения
  • Разработка инструментов тестирования