Thanks to visit codestin.com
Credit goes to github.com

Skip to content

imdeniil/xmlcanon

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

xmlcanon - XML Canonicalization для Python

Python Version License Tests

РСализация трансформации Exclusive XML Canonicalization согласно спСцификации W3C для использования Π² XML подписях ΠΏΠΎ стандарту Π“ΠžΠ‘Π’.

Π§Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° giis-signer - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для подписи XML Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ Π“ΠžΠ‘Π’ Π² систСмС Π“Π˜Π˜Π‘ Π”ΠœΠ”Πš

ОписаниС

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Exclusive XML Canonicalization (ExcC14N), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся критичСски Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ для создания XML Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… подписСй. ΠœΠΎΠ΄ΡƒΠ»ΡŒ создан Π½Π° основС Π°Π½Π°Π»ΠΈΠ·Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ GostCryptography для обСспСчСния совмСстимости с российскими стандартами Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ подписи.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° модуля

xmlcanon/
β”œβ”€β”€ xmlcanon/                    # Основной ΠΏΠ°ΠΊΠ΅Ρ‚
β”‚   β”œβ”€β”€ __init__.py             # ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ API
β”‚   β”œβ”€β”€ transform.py            # Основная Π»ΠΎΠ³ΠΈΠΊΠ° ExcC14N
β”‚   └── exceptions.py           # ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
β”œβ”€β”€ tests/                      # ВСсты
β”‚   β”œβ”€β”€ __init__.py
β”‚   └── test_transform.py       # 14 unit тСстов
β”œβ”€β”€ examples/                   # ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ basic_usage.py          # Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
β”‚   β”œβ”€β”€ gost_integration.py     # Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Π“ΠžΠ‘Π’
β”‚   └── performance_test.py     # ВСсты ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
β”œβ”€β”€ docs/                       # ДокумСнтация
β”‚   β”œβ”€β”€ CHANGELOG.md            # Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
β”‚   └── CONTRIBUTING.md         # Руководство Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
β”œβ”€β”€ setup.py                    # Установочный скрипт
β”œβ”€β”€ requirements.txt            # Зависимости
β”œβ”€β”€ MANIFEST.in                 # Π€Π°ΠΉΠ»Ρ‹ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΏΠ°ΠΊΠ΅Ρ‚
β”œβ”€β”€ LICENSE                     # MIT лицСнзия
└── README.md                   # Основная докумСнтация

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности

  • βœ… Полная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с W3C спСцификациСй Exclusive XML Canonicalization
  • βœ… Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… пространств ΠΈΠΌΠ΅Π½ - ΠΊΠ»ΡŽΡ‡Π΅Π²Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ExcC14N
  • βœ… ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… пространств ΠΈΠΌΠ΅Π½
  • βœ… ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°Ρ сортировка Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² согласно ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ
  • βœ… ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ экранированиС тСкста ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²
  • βœ… ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур любой слоТности
  • βœ… ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈ валидация Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…
  • βœ… Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с lxml ΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ
  • βœ… 14 unit тСстов ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ всС сцСнарии

Установка

Установка ΠΈΠ· PyPI

pip install xmlcanon

Установка с ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ зависимостями

# Π‘ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ lxml (рСкомСндуСтся для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)
pip install xmlcanon[lxml]

# Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
pip install xmlcanon[dev]

Установка ΠΈΠ· исходного ΠΊΠΎΠ΄Π°

git clone https://github.com/imdeniil/xmlcanon.git
cd xmlcanon
pip install -e .

Зависимости

  • Python 3.6+
  • lxml >= 4.0.0 (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, рСкомСндуСтся для Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)

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

ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ использованиС

from xmlcanon import canonicalize_xml

xml_input = '''<root xmlns:ns="http://example.com/ns">
    <ns:element attr="value">Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅</ns:element>
</root>'''

canonicalized = canonicalize_xml(xml_input)
print(canonicalized)

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ использованиС

from xmlcanon import XmlCanonicalizer

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° с ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ пространств ΠΈΠΌΠ΅Π½
canonicalizer = XmlCanonicalizer(
    inclusive_ns_prefixes=['force', 'include']
)

canonicalized = canonicalizer.transform(xml_input)

API Reference

canonicalize_xml(xml_input, inclusive_ns_prefixes=None)

Удобная функция для быстрого примСнСния XML ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • xml_input (str): Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ XML Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚
  • inclusive_ns_prefixes (List[str], optional): ΠŸΡ€Π΅Ρ„ΠΈΠΊΡΡ‹ пространств ΠΈΠΌΠ΅Π½ для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • str: ΠšΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ XML

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

  • InvalidXMLError: ΠŸΡ€ΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ XML
  • TransformationError: ΠŸΡ€ΠΈ ошибкС трансформации

class XmlCanonicalizer

Основной класс для выполнСния XML ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΠΈ.

__init__(inclusive_ns_prefixes=None)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • inclusive_ns_prefixes (List[str], optional): Бписок прСфиксов пространств ΠΈΠΌΠ΅Π½ для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

transform(xml_input)

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊ XML Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • str: ΠšΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ XML

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

from xmlcanon.exceptions import InvalidXMLError, TransformationError

try:
    result = canonicalize_xml(xml_input)
except InvalidXMLError as e:
    print(f"НСкоррСктный XML: {e}")
except TransformationError as e:
    print(f"Ошибка трансформации: {e}")

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… пространств ΠΈΠΌΠ΅Π½

from xmlcanon import canonicalize_xml

xml_input = '''<root xmlns:used="http://used.com"
                    xmlns:unused="http://unused.com">
    <used:element>Волько used ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ</used:element>
</root>'''

result = canonicalize_xml(xml_input)
# Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ НЕ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ xmlns:unused

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: SOAP структура (ΠΊΠ°ΠΊ Π² Π“Π˜Π˜Π‘ Π”ΠœΠ”Πš)

soap_xml = '''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                xmlns:ns="urn://xsd.dmdk.goznak.ru/exchange/1.0">
    <soapenv:Header/>
    <soapenv:Body>
        <ns:SendDealRequest>
            <ns:RequestData id="body">
                <content>Π”Π°Π½Π½Ρ‹Π΅ для подписи</content>
            </ns:RequestData>
        </ns:SendDealRequest>
    </soapenv:Body>
</soapenv:Envelope>'''

canonicalized = canonicalize_xml(soap_xml)
# Π“ΠΎΡ‚ΠΎΠ²ΠΎ для примСнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… трансформаций (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π‘ΠœΠ­Π’)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пространств ΠΈΠΌΠ΅Π½

from xmlcanon import XmlCanonicalizer

xml_input = '''<root xmlns:force="http://force.com"
                    xmlns:used="http://used.com">
    <used:element>Волько used ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² содСрТимом</used:element>
</root>'''

canonicalizer = XmlCanonicalizer(inclusive_ns_prefixes=['force'])
result = canonicalizer.transform(xml_input)
# Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π‘Π£Π”Π•Π’ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ xmlns:force нСсмотря Π½Π° нСиспользованиС

ВСстированиС

# Запуск всСх тСстов
python -m pytest tests/

# Запуск с ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ
python -m pytest tests/ --cov=xmlcanon --cov-report=html

# Запуск ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ тСста
python -m pytest tests/test_transform.py::TestXmlCanonicalizer::test_simple_element

ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами

  • βœ… Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с элСмСнтами ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ
  • βœ… ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° пространств ΠΈΠΌΠ΅Π½ (объявлСния, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ)
  • βœ… Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ пространств ΠΈΠΌΠ΅Π½
  • βœ… Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСкста ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²
  • βœ… Π Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ SOAP структуры (Π“Π˜Π˜Π‘ Π”ΠœΠ”Πš)
  • βœ… ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с XML подписями

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для использования Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠΉ трансформации ΠΏΡ€ΠΈ создании XML подписСй ΠΏΠΎ Π“ΠžΠ‘Π’:

def create_gost_xml_signature(xml_data, certificate):
    # 1. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ XML ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ
    canonicalized = canonicalize_xml(xml_data)

    # 2. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ Π‘ΠœΠ­Π’ Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ)
    smev_transformed = apply_smev_transform(canonicalized)

    # 3. ВычисляСм Ρ…Π΅Ρˆ Π“ΠžΠ‘Π’
    digest = compute_gost_digest(smev_transformed)

    # 4. БоздаСм подпись
    signature = create_gost_signature(digest, certificate)

    return signature

БоотвСтствиС спСцификациям

  • βœ… W3C Exclusive XML Canonicalization Version 1.0 - ΠΏΠΎΠ»Π½ΠΎΠ΅ соотвСтствиС
  • βœ… XML-DSig спСцификация - ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° трансформаций для подписСй
  • βœ… Π“ΠžΠ‘Π’ стандарты - ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с российскими криптографичСскими стандартами

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Π₯арактСристики

  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° XML Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎ 1MB
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ для Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… SOAP структур
  • МинимальноС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ (планируСтся)

Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈ

  • ΠœΠ°Π»Ρ‹ΠΉ XML (< 1KB): ~0.001 сСк
  • Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ XML (10-50KB): ~0.005 сСк
  • Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ XML (100KB+): ~0.020 сСк

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

Настройка срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

# ΠšΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСпозитория
git clone https://github.com/imdeniil/xmlcanon.git
cd xmlcanon

# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ окруТСния
python -m venv venv
source venv/bin/activate  # Linux/Mac
# ΠΈΠ»ΠΈ
venv\Scripts\activate  # Windows

# Установка Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
pip install -e ".[dev]"

Код ΡΡ‚ΠΈΠ»ΡŒ

# Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
black xmlcanon/ tests/ examples/

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° стиля
flake8 xmlcanon/ tests/ examples/

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ²
mypy xmlcanon/

ДокумСнтация

Π’ΠΊΠ»Π°Π΄ Π² Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅

ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΎΠΊ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ:

  • Issues: GitHub Issues
  • Pull Requests: ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ
  • ДокумСнтация: Π² docs/CONTRIBUTING.md
  • Π‘Ρ‚ΠΈΠ»ΡŒ ΠΊΠΎΠ΄Π°: Black + PEP 8

ЛицСнзия

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT. Π‘ΠΌ. Ρ„Π°ΠΉΠ» LICENSE для подробностСй.

ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

v1.0.0

  • ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π΅Π»ΠΈΠ·
  • Полная рСализация ExcC14N согласно W3C спСцификации
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° lxml ΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
  • ПолноС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами (14 тСстов)
  • Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π“ΠžΠ‘Π’ стандартами

Π‘ΠΎΠ·Π΄Π°Π½ΠΎ Π½Π° основС Π°Π½Π°Π»ΠΈΠ·Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ GostCryptography

About

No description, website, or topics provided.

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages