Skip to main content

protocols_dispatcher

Гибкая асинхронная библиотека для диспетчеризации бинарных протоколов

protocols_dispatcher упрощает жизнь, когда нужно:

  • принять поток байтов → превратить в «пакеты» (словарь Python);
  • выбрать обработчик по произвольным фильтрам;
  • отправить ответ тем же транспортом или другим;
  • легко добавлять свои протоколы и транспорты (TCP, serial, файлы — любые).

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

PyPI version License


📦 Установка

# минимальный набор
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

🤝 Контрибьюция

  1. Сделайте форк, создайте ветку feature/whatever.
  2. pre-commit install — сразу проверит code‑style.
  3. Напишите тесты к новому коду.
  4. Отправьте PR и опишите, зачем change полезен.

📄 Лицензия

Проект распространяется под лицензией MIT — см. файл LICENSE.


🙌 Авторы и благодарности

  • Игорь Супрядкин — архитектура и основная реализация
  • ChatGPT — помощь в проработке решений и написаний документации

Если библиотека помогла вам — поставьте ⭐️ в GitHub и расскажите о ней коллегам!

Metadata

Release files for protocols-dispatcher 0.2.0

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

Source distribution (sdist)

Source distribution for protocols-dispatcher 0.2.0
File Size Uploaded
protocols_dispatcher-0.2.0.tar.gz 10.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for protocols-dispatcher 0.2.0
File Interpreter ABI Platform
protocols_dispatcher-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 20.7 kB

Release files / protocols_dispatcher-0.2.0.tar.gz

Download URL protocols_dispatcher-0.2.0.tar.gz
Size 10.9 kB
Tags Source
SHA-256 checksum
How to use checksums
7831397f312d4efaa9423bd142ab1ee393cc96c9466d679bd874aa67371fc154
BLAKE2b-256 checksum
How to use checksums
eef132472178871e0551e0b60fe375ea6e38fb8da8745c7bccb6ed58ec7a6a9e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.2

Release files / protocols_dispatcher-0.2.0-py3-none-any.whl

Download URL protocols_dispatcher-0.2.0-py3-none-any.whl
Size 9.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
94062962cc8457c3d3bc0db2922c7a203a159fbbe3289aaf546df9cb5bd05a70
BLAKE2b-256 checksum
How to use checksums
2ebbdb518be179ba76e22cb7c584968b7b0ed33a8c649fd9ef3b38e6e0b735e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.2

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

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