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.
Вы можете просто предоставить смежным командам ссылку на страницу с вашей документацией, где они смогут ознакомиться со всеми параметрами используемого сервера, каналов и форматом сообщений, потребляемых вашим сервисом.
Подробнее с этим функционалом вы можете ознакомиться в соответсвующем разделе документации.
Также, добавлена возможность определения зависимостей уровня брокера и потребителей:
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
- Синхронная версия брокеров и приложения
- Разработка инструментов тестирования