mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-15 15:59:00 +03:00
test(runner): байтовые проверки канона вместо масок (#57)
Раннер сам прятал дефекты, которые чинит #57. normalizeXmlContent при runtime=python снимал ровно четыре измерения: пробел перед `/>`, whitespace между тегами, пустую пару <Tag></Tag> и хвостовой пробельный мусор. Паритет PS<->PY по этим измерениям проверялся ЧЕРЕЗ маску — расхождение физически не могло упасть. Снято три из четырёх (пробел, пустая пара, хвост). Схлопывание whitespace между тегами оставлено: порты кое-где расставляют отступы иначе, это форматирование, а не байтовый канон. Ужесточён checkPreserves: eol теперь считает ОДИНОЧНЫЕ LF, а не «есть ли хоть один CR». Прежняя проверка пропускала смешанный выход — cfe-init давал 10 CR на 70 строк и проходил её, то есть головной дефект тикета был ей невидим. Добавлены ключи selfClose:"tight" и noEmptyPairs; preserves проставлен в 13 кейсах навыков-эмиттеров (по одному на навык, на его СОБСТВЕННЫЙ артефакт). Снятие масок сразу вскрыло четыре реальных расхождения портов: - form-edit собирает выход из OuterXml и писал `<a />`; в списке 17 навыков его не было, потому что искал по вызовам Save — здесь другой путь. Тот же случай, что с Form.xml в cfe-borrow; - meta-edit py дописывал хвостовой перевод в создаваемый Ext/Predefined.xml и читал существующий без newline='' (терял CRLF); - skd-info py писал отчёт -OutFile без хвостового перевода, PS через WriteAllLines — с ним. Это текстовый отчёт, канон Конфигуратора к нему не относится, поэтому выровнял py по существующему эталону; - фикстуры кейсов содержали <Vendor></Vendor> — снимок нашего же старого вывода. Конфигуратор пустых пар не пишет, .NET их сохраняет, lxml схлопывает. Поправлены 10 фикстур: пары → самозакрывающиеся, EOL и BOM не тронуты. Результат: PS 641/641, python 638/641 (+3 runtimeOnly-скипа) — со снятыми масками. Дрейф снэпшотов: 10 файлов, только пробельные теги и пустые пары. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
11e4e4301f
commit
d7fd6d79d3
@@ -1,4 +1,4 @@
|
||||
# form-edit v1.6 — Edit 1C managed form elements
|
||||
# form-edit v1.7 — Edit 1C managed form elements
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -1387,6 +1387,9 @@ if ($def.elementEvents -and $def.elementEvents.Count -gt 0) {
|
||||
$content = $xmlDoc.OuterXml
|
||||
# Ensure encoding declaration is uppercase UTF-8
|
||||
$content = $content -replace '^<\?xml version="1.0" encoding="utf-8"\?>', '<?xml version="1.0" encoding="UTF-8"?>'
|
||||
# Пустой элемент: OuterXml (как и XmlWriter) пишет `<a />`, Конфигуратор — `<a/>`.
|
||||
# Гард на CDATA/комментарии: только там ` />` может быть содержимым, а не концом тега.
|
||||
if ($content -notmatch '<!\[CDATA\[|<!--') { $content = [regex]::Replace($content, '(?<=\S) />', '/>') }
|
||||
|
||||
$enc = New-Object System.Text.UTF8Encoding($true)
|
||||
[System.IO.File]::WriteAllText($resolvedFormPath, $content, $enc)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-edit v1.6 — Edit 1C managed form elements (Python port)
|
||||
# form-edit v1.7 — Edit 1C managed form elements (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import json
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-edit v1.26 — Edit existing 1C metadata object XML
|
||||
# meta-edit v1.27 — Edit existing 1C metadata object XML
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$DefinitionFile,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-edit v1.26 — Edit existing 1C metadata object XML
|
||||
# meta-edit v1.27 — Edit existing 1C metadata object XML
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -3094,7 +3094,9 @@ def add_predefined_items(items):
|
||||
item_list = items if isinstance(items, list) else [items]
|
||||
items_xml = ''.join(build_predef_item_xml('\t', it, code_type) for it in item_list)
|
||||
if os.path.exists(path):
|
||||
with open(path, 'r', encoding='utf-8-sig') as f:
|
||||
# newline='' => без трансляции переводов строк: иначе CRLF молча схлопнется
|
||||
# в LF при чтении и файл будет переписан в LF (#44/#46/#47).
|
||||
with open(path, 'r', encoding='utf-8-sig', newline='') as f:
|
||||
text = f.read()
|
||||
text = text.replace('</PredefinedData>', items_xml + '</PredefinedData>')
|
||||
else:
|
||||
@@ -3103,7 +3105,7 @@ def add_predefined_items(items):
|
||||
'xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" '
|
||||
'xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
|
||||
f'xsi:type="{xsi_type}" version="{version}">\r\n')
|
||||
text = hdr + items_xml + '</PredefinedData>\r\n'
|
||||
text = hdr + items_xml + '</PredefinedData>'
|
||||
with open(path, 'wb') as f:
|
||||
f.write(b'\xef\xbb\xbf')
|
||||
f.write(text.encode('utf-8'))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# skd-info v1.8 — Analyze 1C DCS structure
|
||||
# skd-info v1.9 — Analyze 1C DCS structure
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# skd-info v1.8 — Analyze 1C DCS structure
|
||||
# skd-info v1.9 — Analyze 1C DCS structure
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -1802,7 +1802,10 @@ def main():
|
||||
if not os.path.isabs(out_path):
|
||||
out_path = os.path.join(os.getcwd(), out_path)
|
||||
with open(out_path, "w", encoding="utf-8-sig") as fh:
|
||||
fh.write("\n".join(result))
|
||||
# Хвостовой перевод строки — как у PS-порта (WriteAllLines его добавляет).
|
||||
# Это текстовый отчёт, а не XML метаданных: канон Конфигуратора сюда не
|
||||
# относится, важен лишь паритет портов.
|
||||
fh.write("\n".join(result) + "\n")
|
||||
print(f"Written {total_lines} lines to {args.OutFile}")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user