Гибкая асинхронная библиотека для диспетчеризации бинарных протоколов
Project description
protocols_dispatcher
Гибкая асинхронная библиотека для диспетчеризации бинарных протоколов
protocols_dispatcher упрощает жизнь, когда нужно:
- принять поток байтов → превратить в «пакеты» (словарь Python);
- выбрать обработчик по произвольным фильтрам;
- отправить ответ тем же транспортом или другим;
- легко добавлять свои протоколы и транспорты (TCP, serial, файлы — любые).
Библиотека уже используется в производственном проекте для работы с наборами микроконтроллеров и бинарных команд.
📦 Установка
# минимальный набор
pip install protocols_dispatcher
# + поддержка работы по последовательному порту через aioserial
pip install protocols_dispatcher[serial]
| extra | что подтягивает | |
|---|---|---|
serial |
aioserial |
🚀 Быстрый старт
import asyncio
from protocols_dispatcher import Dispatcher, AbstractProtocol, AbstractTransport
from protocols_dispatcher.transports.serial import SerialTransport
class EchoProtocol(AbstractProtocol):
async def matches(self, raw: bytes) -> bool:
# «Принимаем» любой кадр
return True
async def deserialize(self, data: bytes):
# Каждый пришедший фрейм — отдельный «пакет»
return [dict(raw=data)]
async def serialize(self, packet: dict):
# Просто оборачиваем в префикс
return b"ACK:" + packet["raw"]
async def main():
proto = EchoProtocol()
transport = SerialTransport(port="/dev/ttyUSB0", baudrate=115200)
dsp = Dispatcher(proto, transport)
@dsp.handler() # без фильтров — ловим всё
async def handle(pkt):
print("RX:", pkt["raw"].hex())
# сформируем и отправим ответ
return dict(raw=pkt["raw"])
# транспорт запускается отдельной корутиной
await transport.run()
asyncio.run(main())
🔍 Основные возможности
-
Асинхронность на всех уровнях — от транспорта до callback-ов.
-
Паттерн «декоратор‑фильтр»
@dispatcher.handler(MyFilter()) def on_custom(pkt): ...
либо через
router.handler(filter=..., protocol=...), если протоколов несколько. -
ProtocolRouter — маршрутизация, когда по одному каналу идёт несколько независимых бинарных протоколов.
-
Тестирование из коробки — примерные
DummyProtocol/DummyTransportи фикстуры дляpytest. -
Extras‑dependencies — лишние зависимости ставятся только при необходимости.
🗂️ Структура проекта
📦 protocols_dispatcher
├─ __init__.py
├─ dispatcher.py # ядро: AbstractProtocol / AbstractTransport / Dispatcher / ProtocolRouter
├─ transports/
│ ├─ __init__.py
│ └─ serial.py # SerialTransport (опция [serial])
└─ tests/
├─ helpers.py # заглушки для юнит‑тестов
├─ conftest.py
└─ ...
🧪 Запуск тестов
git clone https://github.com/your-github/protocols_dispatcher.git
cd protocols_dispatcher
pip install -e .[dev] # dev‑зависимости: pytest, pytest-asyncio, ruff, mypy ...
pytest -q
🤝 Контрибьюция
- Сделайте форк, создайте ветку
feature/whatever. pre-commit install— сразу проверит code‑style.- Напишите тесты к новому коду.
- Отправьте PR и опишите, зачем change полезен.
📄 Лицензия
Проект распространяется под лицензией MIT — см. файл LICENSE.
🙌 Авторы и благодарности
- Игорь Супрядкин — архитектура и основная реализация
- ChatGPT — помощь в проработке решений и написаний документации
Если библиотека помогла вам — поставьте ⭐️ в GitHub и расскажите о ней коллегам!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file protocols_dispatcher-0.2.0.tar.gz.
File metadata
- Download URL: protocols_dispatcher-0.2.0.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7831397f312d4efaa9423bd142ab1ee393cc96c9466d679bd874aa67371fc154
|
|
| MD5 |
a319bf37210a0892a9f2febae3e0c3d1
|
|
| BLAKE2b-256 |
eef132472178871e0551e0b60fe375ea6e38fb8da8745c7bccb6ed58ec7a6a9e
|
File details
Details for the file protocols_dispatcher-0.2.0-py3-none-any.whl.
File metadata
- Download URL: protocols_dispatcher-0.2.0-py3-none-any.whl
- Upload date:
- Size: 9.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94062962cc8457c3d3bc0db2922c7a203a159fbbe3289aaf546df9cb5bd05a70
|
|
| MD5 |
9c4c1849a7b7e3f7b49fdfac764db615
|
|
| BLAKE2b-256 |
2ebbdb518be179ba76e22cb7c584968b7b0ed33a8c649fd9ef3b38e6e0b735e3
|