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.1.0.tar.gz (10.7 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.1.0-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file protocols_dispatcher-0.1.0.tar.gz.

File metadata

  • Download URL: protocols_dispatcher-0.1.0.tar.gz
  • Upload date:
  • Size: 10.7 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.1.0.tar.gz
Algorithm Hash digest
SHA256 85aff654708559ff660819197efccbc68243328039e63876348891faa225a2a2
MD5 dd500005d544e5b3778fb0cc784cd9a5
BLAKE2b-256 b95a58cec658b4021b93eaf3b2bb13bca3b47c6d3464b7d912dcadd02f9a1cf3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for protocols_dispatcher-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d4a4653d5d83b1cc1260447d84ff254625b6a69f92b5079b70c052622dacc2d7
MD5 e9a59c42ede0a94aace00aef275770d5
BLAKE2b-256 c5d175b2d8874e575b08fdc46f3b4d49947e709c118fb086752b1f333fc34412

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