Name | protomorph JSON |
Version |
0.1.0
JSON |
| download |
home_page | None |
Summary | Библиотека для работы с протоколом Protomorph от компании Galileosky |
upload_time | 2025-08-02 14:38:50 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | None |
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"
}