1.4.0 - python-зеркало догнало мастер, структурные свойства реквизита
Выпуск про две вещи: python-зеркало догнало мастер-версию целиком, и группа свойств реквизита перестала уезжать в файл текстом. Обе темы вскрыты одним приемом - сверкой того, что навык производит, с тем, что принимает живая платформа.
Зеркало сведено с мастером
Порты на python отставали шире, чем описывал реестр известных разрывов: 206 зеленых кейсов при 278 падениях вне реестра. Теперь 488 против 486 у PowerShell, регрессов ноль, и реестр действует для обоих рантаймов сразу. Два лишних кейса у зеркала - это разрывы самой PowerShell-версии, которые python проходит.
Падения группировались не по навыкам, а по девяти причинам в общем коде, и одна правка закрывала десятки кейсов: массив и объект в строковом контексте, неупорядоченный словарь, поиск узла без пространства имен, сериализация узла внутри разобранного документа, текстовая запись поверх готовых концов строк, список аргументов в запуске процесса, перехват вывода платформы, потеря формы пустого узла при повторной правке.
Правила приведения к строке в PowerShell не выводились по догадке, а замерены: одиночный объект в "$x" дает @{k=v}, массив склеивает через пробел результаты ToString(), и у разобранного из JSON объекта ToString() пуст.
Что сверка вскрыла в самой мастер-версии
Эталоны закрепляли эти дефекты годами, а тесты их не видели, потому что сравнивали вывод сам с собой.
Многоязычный заголовок выводился одной строкой вида @{ru=...; en=...} в пяти навыках - при том что тест назывался "Многоязычные title и presentation" и проходил.
Правка значения параметра СКД дописывала второй узел вместо изменения первого: поиск по XPath без префикса не находит узел в пространстве имен схемы. Имя теста прямо требовало не дублировать.
Обозначения пустого значения _ и null писались в XML буквально, хотя кейс называется "установка пустого значения". Дефект был замаскирован тем самым дублированием.
Ячейка без указанной колонки попадала в позицию -1, все в одну, вместо раскладки слева направо. Имя картинки терялось - в файл уходил весь объект. Порядок свойств в двух местах был случайным: словарь объявлен неупорядоченным, и эталон закрепил ту раскладку, которую хеш выдал в день записи.
Тест декомпиляции формы проходил по совпадению. Имена флагов в конфигурации навыка не совпадали ни с одной версией, PowerShell выдавал ошибку привязки параметра, а ожидаемой подстрокой было "Form" - она в тексте той ошибки есть.
Структурные свойства реквизита
Семь свойств - Format, EditFormat, ToolTip, MinValue, MaxValue, FillValue, ChoiceParameterLinks, а также LinkByType и ChoiceParameters - записывались текстом объекта. Результат навыка платформа не принимала вовсе: "Ошибка преобразования данных XML".
Формы замерены на 8.5.1 круговым прогоном исходники - база - выгрузка. Три правила стоили нескольких заходов зонда:
- дочерние элементы
LinkByTypeобязаны нести префиксxr; без него платформа принимает файл и молча выбрасывает содержимое; - путь к полю пишется полностью (
<Тип>.<Имя>.Attribute.<Имя>), краткие формы отвергаются сообщением о неверном пути; xsi:nil="true"обязан быть пустым тегом, текст внутри валит загрузку.
Приемка - не совпадение с эталоном, а загрузка платформой: цепочка справочник, форма, правка со всеми свойствами проходит без замечаний.
Прочее
Раскладка ячеек без указания колонки проверяется на переполнение, на смешивание с явными колонками и на выход номера за диапазон - три закрытых разрыва. Правка отсутствующего свойства создает его, а не пропускает молча, и сообщает об этом: при опечатке в имени молчание скрыло бы появление несуществующего свойства.
Реестр разрывов покрывает и интеграционные прогоны. Раньше одно известное падение делало код возврата ненулевым всегда, из-за чего в CI стоял фильтр, отсекавший интеграционные прогоны целиком. Фильтр снят, код возврата стал честным в обоих рантаймах.
В раннере появился флаг --keep-work: без сохраненного рабочего каталога расхождение видно только по обрезанной строке отчета.