Реализация алгоритма трансформации urn://smev-gov-ru/xmldsig/transform для СМЭВ 3.5.0.27
Project description
SMEV Transform (Python) v2.0
Полная реализация алгоритма трансформации "urn://smev-gov-ru/xmldsig/transform" для Python согласно официальной документации СМЭВ 3.5.0.27.
Это улучшенный порт оригинальной PHP библиотеки danbka/smev-transform на Python с полной поддержкой всех 9 шагов трансформации.
📚 Документация СМЭВ
Алгоритм адаптирован для СМЭВ версии 3.5.0.27 согласно официальной документации:
- Методические документы СМЭВ3
- Версия спецификации: 3.5.0.27
🆕 Новое в версии 2.0
КРИТИЧЕСКОЕ ОБНОВЛЕНИЕ: Добавлена полная поддержка Шага 9 - Декодирование текста, который отсутствовал в оригинальной PHP библиотеке!
Что добавлено:
✅ Шаг 9.1 - Декодирование текстовых блоков:
- Снятие экранирования символов (

,<,&и др.) - Корректная обработка CDATA секций
- Умное кодирование блоков по размеру (до 11 символов / от 12 символов)
- Условное кодирование символа
>согласно спецификации
✅ Шаг 9.2 - Декодирование атрибутов:
- Нормализация пробельных символов в атрибутах
- Снятие экранирования в значениях атрибутов
- Правильное кодирование атрибутов
Описание
При подписании XML-фрагментов ЭП в формате XMLDSig, обязательно использование трансформации urn://smev-gov-ru/xmldsig/transform.
Полный алгоритм трансформации (9 шагов)
- ✅ XML declaration и processing instructions удаляются
- ✅ Пробельные символы удаляются из текстовых узлов
- ✅ Empty element tags преобразуются в пары start-tag + end-tag
- ✅ Неиспользуемые namespace prefix удаляются
- ✅ Namespace declarations проверяются и добавляются при необходимости
- ✅ Автоматические префиксы генерируются (ns1, ns2, ...)
- ✅ Атрибуты сортируются в алфавитном порядке
- ✅ Namespace declarations размещаются перед атрибутами
- ✅ Декодирование текста (НОВОЕ!) - полная обработка текстовых блоков и атрибутов
Установка
Из PyPI (рекомендовано)
pip install smev-transform
Из исходников
git clone https://github.com/imdeniil/smev-transform
cd smev-transform
pip install -e .
С использованием uv
uv pip install smev-transform
Использование
Базовое использование
from smev_transform import Transform
transform = Transform()
result = transform.process(xml_string)
Использование отдельных компонентов
from smev_transform import TextDecoder, AttributeDecoder
# Декодирование текстовых блоков
decoded_text = TextDecoder.decode_text_block(text_with_entities)
# Декодирование атрибутов
decoded_attr = AttributeDecoder.decode_attribute_value(attr_value)
Примеры
Пример 1: Базовая трансформация
from smev_transform import Transform
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<elementOne xmlns="http://test/1" xmlns:qwe="http://test/2">
<qwe:elementTwo attB="bbb" attA="aaa"/>
</elementOne>'''
transform = Transform()
result = transform.process(xml)
print(result)
# Результат: <ns1:elementOne xmlns:ns1="http://test/1"><ns2:elementTwo xmlns:ns2="http://test/2" attA="aaa" attB="bbb"></ns2:elementTwo></ns1:elementOne>
Пример 2: Обработка текста с экранированием (Шаг 9.1)
from smev_transform import Transform
xml = '''<root>>>text&content<</root>'''
transform = Transform()
result = transform.process(xml)
print(result)
# Текст проходит декодирование согласно алгоритму СМЭВ
Пример 3: Обработка атрибутов с пробелами (Шаг 9.2)
from smev_transform import Transform
xml = '''<root attr="value with tabs and
newlines"/>'''
transform = Transform()
result = transform.process(xml)
print(result)
# Пробельные символы в атрибутах нормализуются согласно СМЭВ
Пример 4: CDATA секции
from smev_transform import Transform
xml = '''<root>
Текст до CDATA
<![CDATA[Сырой контент < & > остается нетронутым]]>
Текст после CDATA
</root>'''
transform = Transform()
result = transform.process(xml)
# CDATA секции обрабатываются корректно согласно спецификации
Тестирование
# Все тесты
python -m unittest discover tests/
# Конкретные тесты
python -m unittest tests.test_transform -v
python -m unittest tests.test_text_decoder -v
python -m unittest tests.test_attribute_decoder -v
Различия с оригинальной PHP библиотекой
| Функциональность | PHP версия | Python v2.0 |
|---|---|---|
| Шаги 1-8 (базовая трансформация) | ✅ | ✅ |
| Шаг 9.1 (декодирование текста) | ❌ ОТСУТСТВУЕТ | ✅ РЕАЛИЗОВАНО |
| Шаг 9.2 (декодирование атрибутов) | ❌ ОТСУТСТВУЕТ | ✅ РЕАЛИЗОВАНО |
| Обработка CDATA | ⚠️ Частично | ✅ Полностью |
| Соответствие официальной спецификации | ⚠️ 89% | ✅ 100% |
Требования
- Python 3.7+
- Только стандартная библиотека Python (xml.etree.ElementTree)
Структура проекта
smev_transform/
├── __init__.py # Основной модуль
├── transform.py # Главный класс Transform
├── text_decoder.py # Декодирование текстовых блоков (Шаг 9.1)
├── attribute_decoder.py # Декодирование атрибутов (Шаг 9.2)
├── xml_namespace.py # Работа с XML namespaces
├── attribute.py # Представление XML атрибутов
├── comparators.py # Сортировка атрибутов
└── exceptions.py # Исключения
tests/ # Полное покрытие тестами
├── test_transform.py
├── test_text_decoder.py # Тесты Шага 9.1
└── test_attribute_decoder.py # Тесты Шага 9.2
Совместимость и миграция
Миграция с версии 1.0:
- API полностью совместимо - никаких изменений в коде не требуется
- Результаты трансформации могут отличаться из-за добавления Шага 9
- Рекомендуется протестировать с реальными СМЭВ сообщениями
Для продакшен-использования:
- ✅ Версия 2.0 рекомендована для всех новых проектов
- ✅ Полное соответствие официальной документации СМЭВ3
- ✅ Корректная работа с реальными СМЭВ сообщениями
Публикация на PyPI
Для публикации пакета на PyPI:
# Установка инструментов сборки
uv pip install build twine
# Сборка дистрибутива
python -m build
# Публикация на PyPI
python -m twine upload dist/*
Разработка
Установка зависимостей для разработки
uv pip install -e ".[dev]"
Запуск тестов
pytest
# или
python -m pytest -v
Проверка покрытия кода тестами
pytest --cov=smev_transform --cov-report=html
Ссылки
Автор
Daniil (@imdeniil)
- Email: keemor821@gmail.com
- GitHub: https://github.com/imdeniil/
Лицензия
MIT License - см. файл LICENSE для деталей.
⚠️ ВАЖНО: Если вы используете эту библиотеку для интеграции с СМЭВ3, настоятельно рекомендуется использовать версию 2.0, так как она включает все требования официальной спецификации СМЭВ 3.5.0.27.
Поддержка
Если вы обнаружили баг или у вас есть предложения по улучшению, пожалуйста, создайте issue на GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file smev_transform-2.0.0.tar.gz.
File metadata
- Download URL: smev_transform-2.0.0.tar.gz
- Upload date:
- Size: 36.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfa2a8d75a0711f8c774d26591403ade0596ab65ef69e29a6e39f66806e1a385
|
|
| MD5 |
fc6991d6e14d36ee89e4e84f3245264c
|
|
| BLAKE2b-256 |
bfcd3b2f559b457e80c811af74afb47220d8601b05a3f5c33d59012353059f65
|
File details
Details for the file smev_transform-2.0.0-py3-none-any.whl.
File metadata
- Download URL: smev_transform-2.0.0-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b0002c3422cadde52de692896dad2ac1ec50e68670684b516518d358c4addca
|
|
| MD5 |
f9cd8eea38545cb9ee729c7faef7b119
|
|
| BLAKE2b-256 |
ef0e1a1e23e746f18f5f6356b796760bb2d5a343faea995c12eeeceaaf494b67
|