protomorph


Nameprotomorph JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryБиблиотека для работы с протоколом Protomorph от компании Galileosky
upload_time2025-08-02 14:38:50
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords protomorph protocol serialization network
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Protomorph Python Library

Библиотека для работы с протоколом Protomorph на Python.

## Описание

Protomorph - это библиотека для сериализации/десериализации данных, работы с сетевыми пакетами и высокоуровневыми моделями данных в рамках протокола Protomorph.

## Установка

```bash
pip install protomorph
```

Для разработки:
```bash
pip install protomorph[dev]
```

Для веб-интерфейса:
```bash
pip install protomorph[web]
```

## Структура библиотеки

```
protomorph/
├── core/                    # Базовые компоненты
│   ├── protocol/           # Константы и типы протокола
│   ├── serialization/      # Сериализация/десериализация
│   └── utils/              # Утилиты (CRC, хеши)
├── packets/                # Сетевые пакеты
│   ├── base/               # Базовые классы пакетов
│   └── messages/           # Конкретные типы пакетов
├── models/                 # Высокоуровневые модели
│   ├── config/             # Модели конфигураций
│   └── converters/         # Конвертеры форматов
└── transport/              # Транспортный уровень
    └── nats/               # NATS клиент
```

## Быстрый старт

### Работа с метаданными

```python
from protomorph import Meta, Serializer

# Создание метаданных
meta = Meta("MyConfig")
meta.add_field("name", FieldType.STRING)
meta.add_field("value", FieldType.INT32)

# Данные
data = {"name": "test", "value": 42}

# Сериализация
binary_data = Serializer.serialize(meta, data)

# Десериализация
deserialized_data = Serializer.deserialize(meta, binary_data)
```

### Работа с конфигурационными пакетами

```python
from protomorph import ConfigPacket, ConfigType, AckStatus

# Создание пакета запроса
request = ConfigPacket(
    type_val=ConfigType.GetConfig,
    request_type=ConfigType.GetConfig,
    uuid=b'\x00' * 16,
    instance=0
)

# Упаковка пакета
packet_bytes = request.pack()

# Распаковка ответа
response = ConfigPacket.unpack(response_bytes)
```

## Основные компоненты

### Core

- **Meta**: Класс для работы с метаданными
- **Serializer**: Сериализация/десериализация данных
- **FieldType**: Типы полей данных
- **CRC16/CRC32**: Вычисление контрольных сумм

### Packets

- **ConfigPacket**: Пакеты конфигураций
- **AuthMessage**: Пакеты аутентификации
- **CommandPacket**: Командные пакеты

### Models

- **Config**: Высокоуровневая модель конфигурации
- **meta_to_json/data_to_json**: Конвертеры в JSON

## Примеры использования

### Device-Comm сервис

```python
import asyncio
from protomorph import ConfigPacket, ConfigType, Meta, Serializer

async def handle_config_request(msg):
    # Парсим запрос
    request = ConfigPacket.unpack(msg.data)
    
    if request.type == ConfigType.GetConfig:
        # Получаем конфигурацию
        config_data = await fetch_config_from_api(request.uuid)
        
        # Создаем ответ
        meta = Meta.unpack(config_data)
        data = Serializer.deserialize(meta, config_data[len(meta.pack()):])
        
        # Отправляем ответ
        response = ConfigPacket(
            type_val=ConfigType.ConfigAck,
            request_type=ConfigType.GetConfig,
            uuid=request.uuid,
            instance=request.instance,
            status=AckStatus.Success,
            payload=config_data
        )
        
        await msg.respond(response.pack())
```

### API сервис

```python
from protomorph import Config, Meta

# Создание конфигурации из JSON
config = Config.from_dict(json_data)

# Вычисление хеша
config_hash = config.calculate_hash()

# Сериализация в бинарный формат
binary_data = config.serialize()

# Сохранение в объектное хранилище
await object_storage.save(config_hash, binary_data)
```

## Разработка

### Установка для разработки

```bash
git clone https://github.com/protomorph/protomorph-python.git
cd protomorph-python
pip install -e .[dev]
```

### Запуск тестов

```bash
pytest
```

### Форматирование кода

```bash
black .
flake8 .
mypy .
```

## Лицензия

MIT License

## Поддержка

- Документация: https://protomorph.readthedocs.io/
- Issues: https://github.com/protomorph/protomorph-python/issues
- Discussions: https://github.com/protomorph/protomorph-python/discussions 

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "protomorph",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "protomorph, protocol, serialization, network",
    "author": null,
    "author_email": "\"\u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u041a.\" <development@galileosky.com>, \"\u0421\u0435\u043c\u0451\u043d \u041a.\" <development@galileosky.com>",
    "download_url": "https://files.pythonhosted.org/packages/74/7a/e142ce5fa9bdd4330ec001076ce298b435ff422442aae5574f5356b58beb/protomorph-0.1.0.tar.gz",
    "platform": null,
    "description": "# Protomorph Python Library\n\n\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c Protomorph \u043d\u0430 Python.\n\n## \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\n\nProtomorph - \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 Protomorph.\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```bash\npip install protomorph\n```\n\n\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:\n```bash\npip install protomorph[dev]\n```\n\n\u0414\u043b\u044f \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430:\n```bash\npip install protomorph[web]\n```\n\n## \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438\n\n```\nprotomorph/\n\u251c\u2500\u2500 core/                    # \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b\n\u2502   \u251c\u2500\u2500 protocol/           # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\n\u2502   \u251c\u2500\u2500 serialization/      # \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\n\u2502   \u2514\u2500\u2500 utils/              # \u0423\u0442\u0438\u043b\u0438\u0442\u044b (CRC, \u0445\u0435\u0448\u0438)\n\u251c\u2500\u2500 packets/                # \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b\n\u2502   \u251c\u2500\u2500 base/               # \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0430\u043a\u0435\u0442\u043e\u0432\n\u2502   \u2514\u2500\u2500 messages/           # \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0430\u043a\u0435\u0442\u043e\u0432\n\u251c\u2500\u2500 models/                 # \u0412\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\n\u2502   \u251c\u2500\u2500 config/             # \u041c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439\n\u2502   \u2514\u2500\u2500 converters/         # \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432\n\u2514\u2500\u2500 transport/              # \u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\n    \u2514\u2500\u2500 nats/               # NATS \u043a\u043b\u0438\u0435\u043d\u0442\n```\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n### \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438\n\n```python\nfrom protomorph import Meta, Serializer\n\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445\nmeta = Meta(\"MyConfig\")\nmeta.add_field(\"name\", FieldType.STRING)\nmeta.add_field(\"value\", FieldType.INT32)\n\n# \u0414\u0430\u043d\u043d\u044b\u0435\ndata = {\"name\": \"test\", \"value\": 42}\n\n# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\nbinary_data = Serializer.serialize(meta, data)\n\n# \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\ndeserialized_data = Serializer.deserialize(meta, binary_data)\n```\n\n### \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438\n\n```python\nfrom protomorph import ConfigPacket, ConfigType, AckStatus\n\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\nrequest = ConfigPacket(\n    type_val=ConfigType.GetConfig,\n    request_type=ConfigType.GetConfig,\n    uuid=b'\\x00' * 16,\n    instance=0\n)\n\n# \u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430\npacket_bytes = request.pack()\n\n# \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430\nresponse = ConfigPacket.unpack(response_bytes)\n```\n\n## \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b\n\n### Core\n\n- **Meta**: \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438\n- **Serializer**: \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f/\u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\n- **FieldType**: \u0422\u0438\u043f\u044b \u043f\u043e\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\n- **CRC16/CRC32**: \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c\n\n### Packets\n\n- **ConfigPacket**: \u041f\u0430\u043a\u0435\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439\n- **AuthMessage**: \u041f\u0430\u043a\u0435\u0442\u044b \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\n- **CommandPacket**: \u041a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b\n\n### Models\n\n- **Config**: \u0412\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n- **meta_to_json/data_to_json**: \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u0432 JSON\n\n## \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\n\n### Device-Comm \u0441\u0435\u0440\u0432\u0438\u0441\n\n```python\nimport asyncio\nfrom protomorph import ConfigPacket, ConfigType, Meta, Serializer\n\nasync def handle_config_request(msg):\n    # \u041f\u0430\u0440\u0441\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\n    request = ConfigPacket.unpack(msg.data)\n    \n    if request.type == ConfigType.GetConfig:\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e\n        config_data = await fetch_config_from_api(request.uuid)\n        \n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442\n        meta = Meta.unpack(config_data)\n        data = Serializer.deserialize(meta, config_data[len(meta.pack()):])\n        \n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0442\u0432\u0435\u0442\n        response = ConfigPacket(\n            type_val=ConfigType.ConfigAck,\n            request_type=ConfigType.GetConfig,\n            uuid=request.uuid,\n            instance=request.instance,\n            status=AckStatus.Success,\n            payload=config_data\n        )\n        \n        await msg.respond(response.pack())\n```\n\n### API \u0441\u0435\u0440\u0432\u0438\u0441\n\n```python\nfrom protomorph import Config, Meta\n\n# \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 JSON\nconfig = Config.from_dict(json_data)\n\n# \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430\nconfig_hash = config.calculate_hash()\n\n# \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\nbinary_data = config.serialize()\n\n# \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\nawait object_storage.save(config_hash, binary_data)\n```\n\n## \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430\n\n### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n\n```bash\ngit clone https://github.com/protomorph/protomorph-python.git\ncd protomorph-python\npip install -e .[dev]\n```\n\n### \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432\n\n```bash\npytest\n```\n\n### \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430\n\n```bash\nblack .\nflake8 .\nmypy .\n```\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\nMIT License\n\n## \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430\n\n- \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: https://protomorph.readthedocs.io/\n- Issues: https://github.com/protomorph/protomorph-python/issues\n- Discussions: https://github.com/protomorph/protomorph-python/discussions \n",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c Protomorph \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Galileosky",
    "version": "0.1.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/galileosky/protomorph/issues",
        "Documentation": "https://github.com/galileosky/protomorph#readme",
        "Homepage": "https://galileosky.com",
        "Repository": "https://github.com/galileosky/protomorph"
    },
    "split_keywords": [
        "protomorph",
        " protocol",
        " serialization",
        " network"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f2a286142db7840edc4c05c285d83128fcdb3473fdbb1da9e51e595e3be9e93b",
                "md5": "e9552faaf526ab2f3c3a1760eb7fe7c9",
                "sha256": "0bfe1358daed6b76ebea57a1b3a5759460e6ef1cf725330afc8f4d92381172a9"
            },
            "downloads": -1,
            "filename": "protomorph-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "e9552faaf526ab2f3c3a1760eb7fe7c9",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 41205,
            "upload_time": "2025-08-02T14:38:48",
            "upload_time_iso_8601": "2025-08-02T14:38:48.979821Z",
            "url": "https://files.pythonhosted.org/packages/f2/a2/86142db7840edc4c05c285d83128fcdb3473fdbb1da9e51e595e3be9e93b/protomorph-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "747ae142ce5fa9bdd4330ec001076ce298b435ff422442aae5574f5356b58beb",
                "md5": "0658c5967f493b47a437591543327994",
                "sha256": "ba982bebf35b6de181c200ab1bb1fa912e3a28d9df56f1acff6322ef79a30c0c"
            },
            "downloads": -1,
            "filename": "protomorph-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "0658c5967f493b47a437591543327994",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 35156,
            "upload_time": "2025-08-02T14:38:50",
            "upload_time_iso_8601": "2025-08-02T14:38:50.473510Z",
            "url": "https://files.pythonhosted.org/packages/74/7a/e142ce5fa9bdd4330ec001076ce298b435ff422442aae5574f5356b58beb/protomorph-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-02 14:38:50",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "galileosky",
    "github_project": "protomorph",
    "github_not_found": true,
    "lcname": "protomorph"
}
        
Elapsed time: 3.11471s