fix(cfe-borrow,template-add,help-add,interface-edit): вывод py-порта не зависит от ОС (#57)

Тот же writer без newline="", что чинился в form-add.py, остался ещё в четырёх
py-портах, и пишут они не модули, а 1С XML: заимствованные объекты и метаданные
формы (cfe-borrow), Template.xml и XML-макеты (template-add), Help.xml (help-add),
вновь создаваемый CommandInterface.xml (interface-edit).

Контент там собирается литералами с \n, поэтому текстовый режим Python давал CRLF
на Windows — «случайно правильно» — и LF на macOS, ломая канон #57 ровно там, где он
только что установлен. Проверено на маке ДО фикса: cfe-borrow 0 CRLF + 33 одиночных
LF, template-add 0 + 2, interface-edit 0 + 5. Порчи \r\r\n не было, но это везение:
подай такой writer CRLF-контент — каждая строка стала бы \r\r\n.

Почему не поймали раньше: аудит гонялся на Windows, где текстовый режим даёт канон;
снэпшоты нормализуют EOL; байтовый preserves ни разу не проверялся на маке.

Разделены два пути, которые я сперва смешал в cfe-borrow:

- save_xml_file — канон (CRLF, без хвоста) для файлов, которые СОЗДАЁМ;
- save_text_bom — пишет как есть, для файлов, которые ПРАВИМ: переводы строк уже
  пришли из самого файла и менять их нельзя (контракт #44/#46/#47). Туда же
  добавлено чтение с newline="" — иначе CRLF терялся ещё на входе.

interface-edit чинится и в PS-порте: ветка -CreateIfMissing давала смешанный EOL
(3 CRLF + 2 одиночных LF) уже на Windows. Аудит #57 её пропустил, потому что
фильтровал файлы по расширению .xml, а кейс создаёт файл с именем без расширения.

Канон, как выяснилось, зависит от типа артефакта: XML — CRLF, текстовый макет —
CRLF, а HTML-макет платформа хранит с LF (корпус: 399 LF из 400). Поэтому HTML
через канон-writer НЕ идёт.

preserves добавлен четырём навыкам (у них его не было вовсе) + отдельно на Help.xml.
Именно прогон на маке и даёт покрытие: на Windows эти кейсы зелены и без фикса.

Windows 641/641 обоими портами, мак 590/0/51, дрейфа снэпшотов нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-05 18:53:17 +03:00
co-authored by Claude Opus 5
parent 668b145010
commit caf038a192
12 changed files with 198 additions and 54 deletions
+29 -4
View File
@@ -3,13 +3,38 @@
"preRun": [
{
"script": "meta-compile/scripts/meta-compile",
"input": { "type": "Catalog", "name": "Товары" },
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
"input": {
"type": "Catalog",
"name": "Товары"
},
"args": {
"-JsonPath": "{inputFile}",
"-OutputDir": "{workDir}"
}
},
{
"script": "cfe-init/scripts/cfe-init",
"args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" }
"args": {
"-Name": "Тест",
"-OutputDir": "{workDir}/ext",
"-ConfigPath": "{workDir}"
}
}
],
"params": { "extensionPath": "ext", "object": "Catalog.Товары" }
"params": {
"extensionPath": "ext",
"object": "Catalog.Товары"
},
"expect": {
"preserves": {
"file": "Ext/Catalogs/Товары.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
+22 -10
View File
@@ -13,15 +13,27 @@
"objectName": "МояОбработка"
},
"expect": {
"preserves": {
"file": "МояОбработка.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
"preserves": [
{
"file": "МояОбработка.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
},
{
"file": "МояОбработка/Ext/Help.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
]
}
}
+38 -7
View File
@@ -3,18 +3,49 @@
"preRun": [
{
"script": "meta-compile/scripts/meta-compile",
"input": { "type": "Catalog", "name": "Товары" },
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
"input": {
"type": "Catalog",
"name": "Товары"
},
"args": {
"-JsonPath": "{inputFile}",
"-OutputDir": "{workDir}"
}
},
{
"script": "subsystem-compile/scripts/subsystem-compile",
"input": { "name": "Склад", "objects": ["Catalogs.Товары"] },
"args": { "-DefinitionFile": "{inputFile}", "-OutputDir": "{workDir}" }
"input": {
"name": "Склад",
"objects": [
"Catalogs.Товары"
]
},
"args": {
"-DefinitionFile": "{inputFile}",
"-OutputDir": "{workDir}"
}
}
],
"params": { "ciPath": "Subsystems/Склад/CommandInterface" },
"params": {
"ciPath": "Subsystems/Склад/CommandInterface"
},
"input": [
{ "operation": "place", "value": "{\"command\": \"Catalog.Товары\", \"group\": \"NavigationPanel.Important\"}" }
{
"operation": "place",
"value": "{\"command\": \"Catalog.Товары\", \"group\": \"NavigationPanel.Important\"}"
}
],
"CreateIfMissing": true
"CreateIfMissing": true,
"expect": {
"preserves": {
"file": "Subsystems/Склад/CommandInterface",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}
+21 -2
View File
@@ -3,8 +3,27 @@
"preRun": [
{
"script": "epf-init/scripts/init",
"args": { "-Name": "МояОбработка", "-SrcDir": "{workDir}" }
"args": {
"-Name": "МояОбработка",
"-SrcDir": "{workDir}"
}
}
],
"params": { "objectName": "МояОбработка", "templateName": "Макет", "templateType": "SpreadsheetDocument" }
"params": {
"objectName": "МояОбработка",
"templateName": "Макет",
"templateType": "SpreadsheetDocument"
},
"expect": {
"preserves": {
"file": "МояОбработка/Templates/Макет/Ext/Template.xml",
"bom": true,
"eol": "crlf",
"encoding": "UTF-8",
"finalNewline": false,
"noCR13": true,
"selfClose": "tight",
"noEmptyPairs": true
}
}
}