Skip to main content

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

Project description

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 и расскажите о ней коллегам!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

protocols_dispatcher-0.2.0.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

protocols_dispatcher-0.2.0-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

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

Hashes for protocols_dispatcher-0.2.0.tar.gz
Algorithm Hash digest
SHA256 7831397f312d4efaa9423bd142ab1ee393cc96c9466d679bd874aa67371fc154
MD5 a319bf37210a0892a9f2febae3e0c3d1
BLAKE2b-256 eef132472178871e0551e0b60fe375ea6e38fb8da8745c7bccb6ed58ec7a6a9e

See more details on using hashes here.

File details

Details for the file protocols_dispatcher-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for protocols_dispatcher-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 94062962cc8457c3d3bc0db2922c7a203a159fbbe3289aaf546df9cb5bd05a70
MD5 9c4c1849a7b7e3f7b49fdfac764db615
BLAKE2b-256 2ebbdb518be179ba76e22cb7c584968b7b0ed33a8c649fd9ef3b38e6e0b735e3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page