From 1128460c32d63cb73789a619b23191b649dbe7bd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:03:16 +0000 Subject: [PATCH 1/9] Initial plan From 68745f35f0feea2d5ac6a7f31362addbb059d38e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:09:44 +0000 Subject: [PATCH 2/9] =?UTF-8?q?Enable=20all=2047=20skipped=20tests=20by=20?= =?UTF-8?q?removing=20&=D0=92=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=20?= =?UTF-8?q?annotations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- tests/yaml_test_suite.os | 47 ---------------------------------------- 1 file changed, 47 deletions(-) diff --git a/tests/yaml_test_suite.os b/tests/yaml_test_suite.os index eb10bcb..ba6bc1a 100644 --- a/tests/yaml_test_suite.os +++ b/tests/yaml_test_suite.os @@ -598,7 +598,6 @@ &Тег("whitespace") &Тег("folded") &Тег("scalar") -&Выключен("Парсинг отступов в блочных скалярах") Процедура Test_R4YG() Экспорт ВыполнитьТест("R4YG"); КонецПроцедуры @@ -627,7 +626,6 @@ &ОтображаемоеИмя("AZW3: Lookahead test cases") &Тег("mapping") &Тег("edge") -&Выключен("Ошибка парсинга JSON") Процедура Test_AZW3() Экспорт ВыполнитьТест("AZW3"); КонецПроцедуры @@ -908,7 +906,6 @@ &Тег("folded") &Тег("scalar") &Тег("1_3_err") -&Выключен("Неправильная обработка отступов в свернутых блоках") Процедура Test_6VJK() Экспорт ВыполнитьТест("6VJK"); @@ -923,7 +920,6 @@ &Тег("whitespace") &Тег("folded") &Тег("scalar") -&Выключен("Неправильная обработка отступов в блочных скалярах") Процедура Test_4QFQ() Экспорт ВыполнитьТест("4QFQ"); @@ -1076,7 +1072,6 @@ &ОтображаемоеИмя("DK95/06: Tabs that look like indentation") &Тег("indent") &Тег("whitespace") -&Выключен("Неправильная обработка табуляции") Процедура Test_DK95_06() Экспорт ВыполнитьТест("DK95/06"); @@ -1194,7 +1189,6 @@ &ОтображаемоеИмя("DE56/03: Trailing tabs in double quoted") &Тег("whitespace") &Тег("double") -&Выключен("Неправильная обработка табуляции в строках") Процедура Test_DE56_03() Экспорт ВыполнитьТест("DE56/03"); @@ -1220,7 +1214,6 @@ &ОтображаемоеИмя("DE56/02: Trailing tabs in double quoted") &Тег("whitespace") &Тег("double") -&Выключен("Неправильная обработка табуляции в строках") Процедура Test_DE56_02() Экспорт ВыполнитьТест("DE56/02"); @@ -1246,7 +1239,6 @@ &ОтображаемоеИмя("F6MC: More indented lines at the beginning of folded block scalars") &Тег("indent") &Тег("folded") -&Выключен("Неправильная обработка отступов в свернутых блоках") Процедура Test_F6MC() Экспорт ВыполнитьТест("F6MC"); @@ -1557,7 +1549,6 @@ &Тег("sequence") &Тег("error") &Тег("flow") -&Выключен("Не обрабатывается ошибка комментария после запятой") Процедура Test_CVW2() Экспорт ВыполнитьТест("CVW2"); @@ -1704,7 +1695,6 @@ &Тег("comment") &Тег("spec") &Тег("scalar") -&Выключен("Неправильная обработка обрезки конечных строк") Процедура Test_F8F9() Экспорт ВыполнитьТест("F8F9"); @@ -1813,7 +1803,6 @@ &Тест &ОтображаемоеИмя("H7TQ: Extra words on %YAML directive") &Тег("directive") -&Выключен("Не обрабатывается ошибка лишних слов в YAML директиве") Процедура Test_H7TQ() Экспорт ВыполнитьТест("H7TQ"); @@ -1841,7 +1830,6 @@ &ОтображаемоеИмя("W5VH: Allowed characters in alias") &Тег("alias") &Тег("1_3_err") -&Выключен("Ошибка обработки символов в алиасах") Процедура Test_W5VH() Экспорт ВыполнитьТест("W5VH"); @@ -1916,7 +1904,6 @@ &Тег("whitespace") &Тег("folded") &Тег("error") -&Выключен("Не обрабатывается ошибка неправильного отступа") Процедура Test_5LLU() Экспорт ВыполнитьТест("5LLU"); @@ -2086,7 +2073,6 @@ &ОтображаемоеИмя("2G84/00: Literal modifers") &Тег("literal") &Тег("scalar") -&Выключен("Не обрабатывается ошибка неправильных модификаторов") Процедура Test_2G84_00() Экспорт ВыполнитьТест("2G84/00"); @@ -2096,7 +2082,6 @@ &ОтображаемоеИмя("2G84/01: Literal modifers") &Тег("literal") &Тег("scalar") -&Выключен("Не обрабатывается ошибка неправильных модификаторов") Процедура Test_2G84_01() Экспорт ВыполнитьТест("2G84/01"); @@ -2160,7 +2145,6 @@ &ОтображаемоеИмя("SF5V: Duplicate YAML directive") &Тег("directive") &Тег("error") -&Выключен("Не обрабатывается ошибка дублированной YAML директивы") Процедура Test_SF5V() Экспорт ВыполнитьТест("SF5V"); @@ -2329,7 +2313,6 @@ &Тег("mapping") &Тег("double") &Тег("error") -&Выключен("Не обрабатывается ошибка неправильного отступа в маппинге") Процедура Test_U44R() Экспорт ВыполнитьТест("U44R"); @@ -2341,7 +2324,6 @@ &Тег("anchor") &Тег("sequence") &Тег("flow") -&Выключен("Неправильная обработка якорей в последовательностях") Процедура Test_CN3R() Экспорт ВыполнитьТест("CN3R"); @@ -2398,7 +2380,6 @@ &Тег("mapping") &Тег("comment") &Тег("error") -&Выключен("Не обрабатывается ошибка комментария как ключа маппинга") Процедура Test_GDY7() Экспорт ВыполнитьТест("GDY7"); @@ -2419,7 +2400,6 @@ &Тег("document") &Тег("directive") &Тег("error") -&Выключен("Не обрабатывается ошибка директивы без документа") Процедура Test_B63P() Экспорт ВыполнитьТест("B63P"); @@ -2481,7 +2461,6 @@ &Тег("comment") &Тег("error") &Тег("flow") -&Выключен("Не обрабатывается ошибка пропущенной запятой в flow") Процедура Test_CML9() Экспорт ВыполнитьТест("CML9"); @@ -2506,7 +2485,6 @@ &Тег("folded") &Тег("scalar") &Тег("error") -&Выключен("Не обрабатывается ошибка лишних пробелов в блочных скалярах") Процедура Test_S98Z() Экспорт ВыполнитьТест("S98Z"); @@ -2551,7 +2529,6 @@ &Тег("mapping") &Тег("whitespace") &Тег("error") -&Выключен("Не обрабатывается ошибка табуляции в отступах маппинга") Процедура Test_4EJS() Экспорт ВыполнитьТест("4EJS"); @@ -2705,7 +2682,6 @@ &ОтображаемоеИмя("3HFZ: Invalid content after document end marker") &Тег("footer") &Тег("error") -&Выключен("Не обрабатывается ошибка содержимого после маркера конца документа") Процедура Test_3HFZ() Экспорт ВыполнитьТест("3HFZ"); @@ -2734,7 +2710,6 @@ &Тег("literal") &Тег("whitespace") &Тег("scalar") -&Выключен("Неправильная обработка keep модификатора блочного скаляра") Процедура Test_6FWR() Экспорт ВыполнитьТест("6FWR"); @@ -2784,7 +2759,6 @@ &Тест &ОтображаемоеИмя("MUS6/00: Directive variants") &Тег("directive") -&Выключен("Не обрабатывается ошибка неправильных вариантов директив") Процедура Test_MUS6_00() Экспорт ВыполнитьТест("MUS6/00"); @@ -2793,7 +2767,6 @@ &Тест &ОтображаемоеИмя("MUS6/01: Directive variants") &Тег("directive") -&Выключен("Не обрабатывается ошибка неправильных вариантов директив") Процедура Test_MUS6_01() Экспорт ВыполнитьТест("MUS6/01"); @@ -2865,7 +2838,6 @@ &ОтображаемоеИмя("E76Z: Aliases in Implicit Block Mapping") &Тег("mapping") &Тег("alias") -&Выключен("Ошибка обработки алиасов в неявных блочных маппингах") Процедура Test_E76Z() Экспорт ВыполнитьТест("E76Z"); @@ -2933,7 +2905,6 @@ &Тег("literal") &Тег("spec") &Тег("scalar") -&Выключен("Неправильная обработка обрезки финального переноса строки") Процедура Test_A6F9() Экспорт ВыполнитьТест("A6F9"); @@ -2949,7 +2920,6 @@ &Тест &ОтображаемоеИмя("Y79Y/000: Tabs in various contexts") &Тег("whitespace") -&Выключен("Не обрабатывается ошибка табуляции в различных контекстах") Процедура Test_Y79Y_000() Экспорт ВыполнитьТест("Y79Y/000"); @@ -2972,7 +2942,6 @@ &Тест &ОтображаемоеИмя("Y79Y/001: Tabs in various contexts") &Тег("whitespace") -&Выключен("Неправильная обработка табуляции в различных контекстах") Процедура Test_Y79Y_001() Экспорт ВыполнитьТест("Y79Y/001"); @@ -3002,7 +2971,6 @@ &Тест &ОтображаемоеИмя("Y79Y/004: Tabs in various contexts") &Тег("whitespace") -&Выключен("Не обрабатывается ошибка табуляции в различных контекстах") Процедура Test_Y79Y_004() Экспорт ВыполнитьТест("Y79Y/004"); @@ -3011,7 +2979,6 @@ &Тест &ОтображаемоеИмя("Y79Y/005: Tabs in various contexts") &Тег("whitespace") -&Выключен("Не обрабатывается ошибка табуляции в различных контекстах") Процедура Test_Y79Y_005() Экспорт ВыполнитьТест("Y79Y/005"); @@ -3055,7 +3022,6 @@ &Тест &ОтображаемоеИмя("JEF9/02: Trailing whitespace in streams") &Тег("literal") -&Выключен("Неправильная обработка завершающих пробелов в потоках") Процедура Test_JEF9_02() Экспорт ВыполнитьТест("JEF9/02"); @@ -3072,7 +3038,6 @@ &Тест &ОтображаемоеИмя("JEF9/01: Trailing whitespace in streams") &Тег("literal") -&Выключен("Неправильная обработка завершающих пробелов в потоках") Процедура Test_JEF9_01() Экспорт ВыполнитьТест("JEF9/01"); @@ -3101,7 +3066,6 @@ &Тег("folded") &Тег("scalar") &Тег("1_3_err") -&Выключен("Неправильная обработка свернутых строк и финальных пустых строк") Процедура Test_7T8X() Экспорт ВыполнитьТест("7T8X"); @@ -3125,7 +3089,6 @@ &Тег("literal") &Тег("whitespace") &Тег("error") -&Выключен("Не обрабатывается ошибка лишних пробелов в первой строке") Процедура Test_W9L4() Экспорт ВыполнитьТест("W9L4"); @@ -3252,7 +3215,6 @@ &ОтображаемоеИмя("9MMA: Directive by itself with no document") &Тег("directive") &Тег("error") -&Выключен("Не обрабатывается ошибка директивы без документа") Процедура Test_9MMA() Экспорт ВыполнитьТест("9MMA"); @@ -3273,7 +3235,6 @@ &Тег("mapping") &Тег("alias") &Тег("whitespace") -&Выключен("Неправильная обработка пробелов вокруг двоеточия в маппингах") Процедура Test_26DV() Экспорт ВыполнитьТест("26DV"); @@ -3293,7 +3254,6 @@ &Тег("mapping") &Тег("error") &Тег("flow") -&Выключен("Не обрабатывается ошибка пропущенной запятой в flow маппинге") Процедура Test_T833() Экспорт ВыполнитьТест("T833"); @@ -3349,7 +3309,6 @@ &Тег("folded") &Тег("scalar") &Тег("1_3_err") -&Выключен("Неправильная обработка блочного свертывания") Процедура Test_MJS9() Экспорт ВыполнитьТест("MJS9"); @@ -3567,7 +3526,6 @@ &Тег("anchor") &Тег("error") &Тег("header") -&Выключен("Не обрабатывается ошибка якоря на строке начала документа") Процедура Test_CXX2() Экспорт ВыполнитьТест("CXX2"); @@ -3579,7 +3537,6 @@ &Тег("alias") &Тег("edge") &Тег("1_3_err") -&Выключен("Неправильная обработка якорей с двоеточием в имени") Процедура Test_2SXE() Экспорт ВыполнитьТест("2SXE"); @@ -3591,7 +3548,6 @@ &Тег("sequence") &Тег("error") &Тег("flow") -&Выключен("Не обрабатывается ошибка неявного ключа с переносом строки") Процедура Test_DK4H() Экспорт ВыполнитьТест("DK4H"); @@ -3606,7 +3562,6 @@ &Тег("spec") &Тег("whitespace") &Тег("sequence") -&Выключен("Неправильная обработка индикаторов отступа") Процедура Test_A2M4() Экспорт ВыполнитьТест("A2M4"); @@ -3713,7 +3668,6 @@ &Тег("spec") &Тег("folded") &Тег("scalar") -&Выключен("Неправильная обработка заголовка блочного скаляра") Процедура Test_P2AD() Экспорт ВыполнитьТест("P2AD"); @@ -3760,7 +3714,6 @@ &Тег("anchor") &Тег("sequence") &Тег("error") -&Выключен("Не обрабатывается ошибка якоря перед элементом последовательности") Процедура Test_SY6V() Экспорт ВыполнитьТест("SY6V"); From bc3b1ce1db4128fc3083e7986c3c41c7b14a8fb6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:15:11 +0000 Subject: [PATCH 3/9] Add YAML directive validation (fixes 4 tests) Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...20\267\320\260\321\202\320\276\321\200.os" | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 1899ed8..1f6d0b1 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -41,7 +41,7 @@ // Состояние парсинга Перем ТекущиеТАГДирективы; // Хранилище TAG директив - +Перем ВстречалаYAMLДиректива; // Флаг встречи YAML директивы в текущем документе Перем Якоря; // Соответствие для хранения якорей @@ -121,6 +121,9 @@ // Очищаем TAG директивы перед началом парсинга ТекущиеТАГДирективы.Очистить(); + // Сбрасываем флаг YAML директивы + ВстречалаYAMLДиректива = Ложь; + // Очищаем якоря перед началом парсинга Якоря.Очистить(); @@ -172,6 +175,9 @@ Если Не Документ = Неопределено Тогда МассивСтрокДокументов.Добавить(Документ); + ИначеЕсли ВстречалаYAMLДиректива Тогда + // Если была YAML директива, но нет документа - это ошибка + ВызватьИсключение "YAML директива без последующего документа"; КонецЕсли; Лог.Отладка("Разбиение на документы завершено, найдено " + МассивСтрокДокументов.Количество() + " документов"); @@ -223,6 +229,8 @@ МассивСтрокДокументов.Добавить(Документ); // Очищаем TAG директивы только после обработки предыдущего документа ТекущиеТАГДирективы.Очистить(); + // Сбрасываем флаг YAML директивы для нового документа + ВстречалаYAMLДиректива = Ложь; КонецЕсли; Документ = Новый Массив(); @@ -249,8 +257,14 @@ // Конец текущего документа Если Документ <> Неопределено И Документ.Количество() > 0 Тогда МассивСтрокДокументов.Добавить(Документ); + ИначеЕсли ВстречалаYAMLДиректива Тогда + // Если была директива, но пустой или несуществующий документ, это ошибка + ВызватьИсключение "YAML директива без последующего документа"; КонецЕсли; + Документ = Неопределено; // Переходим в состояние вне документа + // Сбрасываем флаг YAML директивы + ВстречалаYAMLДиректива = Ложь; Возврат Документ; @@ -339,8 +353,28 @@ Функция ОбработатьСтрокуВнеДокумента(СтрокаБезПробелов, ПолнаяСтрока, Документ) // Мы вне документа - здесь можем обрабатывать YAML директивы Если СтрНачинаетсяС(СтрокаБезПробелов, "%YAML") Тогда - Лог.Отладка("Обработка YAML директивы (игнорируем): " + СтрокаБезПробелов); - // YAML директивы игнорируем, но не добавляем в документ + Лог.Отладка("Обработка YAML директивы: " + СтрокаБезПробелов); + + // Проверяем, не была ли уже YAML директива + Если ВстречалаYAMLДиректива Тогда + ВызватьИсключение "Дублирование YAML директивы не допускается"; + КонецЕсли; + + // Валидируем формат YAML директивы + ЧастиДирективы = СтрРазделить(СтрокаБезПробелов, " ", Истина); + Если ЧастиДирективы.Количество() > 2 Тогда + ВызватьИсключение "YAML директива содержит лишние слова: " + СтрокаБезПробелов; + ИначеЕсли ЧастиДирективы.Количество() < 2 Тогда + ВызватьИсключение "YAML директива должна содержать версию"; + КонецЕсли; + + // Проверяем формат версии (должно быть x.y) + Версия = ЧастиДирективы[1]; + Если НЕ СтрНайти(Версия, ".") > 0 Тогда + ВызватьИсключение "Неверный формат версии YAML директивы: " + Версия; + КонецЕсли; + + ВстречалаYAMLДиректива = Истина; Возврат Документ; ИначеЕсли СтрНачинаетсяС(СтрокаБезПробелов, "%") И НЕ СтрНачинаетсяС(СтрокаБезПробелов, "%TAG") Тогда // Неизвестные директивы (как %FOO) должны игнорироваться с предупреждением @@ -5886,6 +5920,9 @@ YAML_ТЕРМИНАТОР_ДОКУМЕНТА = "..."; // Хранилище TAG директив для текущего документа ТекущиеТАГДирективы = Новый Соответствие(); +// Флаг наличия YAML директивы в текущем документе +ВстречалаYAMLДиректива = Ложь; + // Инициализация кэша якорей Якоря = Новый Соответствие; From c7e8772c786f9b2894ab8c68d4b312f9cc70a27a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:17:46 +0000 Subject: [PATCH 4/9] Add document terminator validation and improve YAML directive checks (fixes 2 more tests) Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...20\267\320\260\321\202\320\276\321\200.os" | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 1f6d0b1..0ea5f0e 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -370,6 +370,12 @@ // Проверяем формат версии (должно быть x.y) Версия = ЧастиДирективы[1]; + + // Проверяем, нет ли комментария без пробела (например, "1.1#comment") + Если СтрНайти(Версия, "#") > 0 Тогда + ВызватьИсключение "Комментарий в YAML директиве должен быть отделен пробелом"; + КонецЕсли; + Если НЕ СтрНайти(Версия, ".") > 0 Тогда ВызватьИсключение "Неверный формат версии YAML директивы: " + Версия; КонецЕсли; @@ -5767,12 +5773,17 @@ Возврат Ложь; КонецЕсли; - // В YAML ... должно быть в отдельной строке или с пробелом после + // В YAML ... должно быть в отдельной строке или только с пробелами/комментариями после ОстаткСтроки = Сред(СокращеннаяСтрока, СтрДлина(YAML_ТЕРМИНАТОР_ДОКУМЕНТА) + 1); - - // Если есть остаток, он должен начинаться с пробела или быть пустым - Если НЕ ПустаяСтрока(ОстаткСтроки) И НЕ СтрНачинаетсяС(ОстаткСтроки, " ") И НЕ СтрНачинаетсяС(ОстаткСтроки, Символы.Таб) Тогда - Возврат Ложь; + ОстаткСтрокиБезПробелов = СокрЛП(ОстаткСтроки); + + // Проверяем остаток строки + Если НЕ ПустаяСтрока(ОстаткСтрокиБезПробелов) Тогда + // Если есть непробельное содержимое, оно должно быть комментарием + Если НЕ СтрНачинаетсяС(ОстаткСтрокиБезПробелов, "#") Тогда + // Если это не комментарий, то это ошибка + ВызватьИсключение "Недопустимое содержимое после маркера конца документа: " + СокращеннаяСтрока; + КонецЕсли; КонецЕсли; Возврат Истина; From 8e35f1cbfd5792a60c1b0adcc15f63ac4e7623c1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:20:19 +0000 Subject: [PATCH 5/9] Add validation for block scalar indentation indicators (fixes 2 more tests) Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...20\267\320\260\321\202\320\276\321\200.os" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 0ea5f0e..5b9d020 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -4283,6 +4283,10 @@ КонецЕсли; УправляющийПодсимвол = ПолучитьУправляющийПодсимвол(Строка, ДанныеУправляющегоСимвола.Позиция + 1); + + // Валидация управляющего подсимвола + ПроверитьУправляющийПодсимвол(УправляющийПодсимвол); + Лог.Отладка("Найден управляющий символ: %1 с подсимволом: %2", ДанныеУправляющегоСимвола.Символ, УправляющийПодсимвол); @@ -4498,6 +4502,35 @@ КонецФункции +// Проверяет корректность управляющего подсимвола блочного скаляра +// +// Параметры: +// УправляющийПодсимвол - Строка - подсимвол после | или > (например, "2-", "+", "10") +// +Процедура ПроверитьУправляющийПодсимвол(УправляющийПодсимвол) + Если ПустаяСтрока(УправляющийПодсимвол) Тогда + Возврат; // Пустой подсимвол допустим + КонецЕсли; + + // Удаляем допустимые chomping модификаторы + ПодсимволБезChomping = СтрЗаменить(УправляющийПодсимвол, "+", ""); + ПодсимволБезChomping = СтрЗаменить(ПодсимволБезChomping, "-", ""); + ПодсимволБезChomping = СокрЛП(ПодсимволБезChomping); + + // Если после удаления chomping символов что-то осталось + Если НЕ ПустаяСтрока(ПодсимволБезChomping) Тогда + // Это должен быть индикатор отступа - единственная цифра от 1 до 9 + Если СтрДлина(ПодсимволБезChomping) > 1 Тогда + ВызватьИсключение "Индикатор отступа блочного скаляра должен быть единственной цифрой (1-9): " + УправляющийПодсимвол; + КонецЕсли; + + Цифра = Число(ПодсимволБезChomping); + Если Цифра < 1 ИЛИ Цифра > 9 Тогда + ВызватьИсключение "Индикатор отступа блочного скаляра должен быть цифрой от 1 до 9: " + УправляющийПодсимвол; + КонецЕсли; + КонецЕсли; +КонецПроцедуры + Функция ПолучитьУправляющийПодсимвол(Строка, Позиция) Если СтрДлина(Строка) < Позиция Тогда Возврат ""; // Нет подсимвола, возвращаем пустую строку From 30fa1c00da405ae5742c843393035cb8ad0f30b6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 18:51:30 +0000 Subject: [PATCH 6/9] Fix YAML directive validation logic for empty documents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed ОбработатьТерминаторДокумента to check directive without document BEFORE processing document - This allows empty documents (---\n...) to be valid while still catching orphaned directives - Added try-catch in ПроверитьУправляющийПодсимвол for safer number parsing Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...20\267\320\260\321\202\320\276\321\200.os" | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 5b9d020..6e23589 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -254,12 +254,15 @@ // Функция ОбработатьТерминаторДокумента(Документ, МассивСтрокДокументов) + // Проверяем наличие директивы без документа + Если Документ = Неопределено И ВстречалаYAMLДиректива Тогда + // Если была директива, но документ не был начат (нет ---), это ошибка + ВызватьИсключение "YAML директива без последующего документа"; + КонецЕсли; + // Конец текущего документа Если Документ <> Неопределено И Документ.Количество() > 0 Тогда МассивСтрокДокументов.Добавить(Документ); - ИначеЕсли ВстречалаYAMLДиректива Тогда - // Если была директива, но пустой или несуществующий документ, это ошибка - ВызватьИсключение "YAML директива без последующего документа"; КонецЕсли; Документ = Неопределено; // Переходим в состояние вне документа @@ -4524,10 +4527,15 @@ ВызватьИсключение "Индикатор отступа блочного скаляра должен быть единственной цифрой (1-9): " + УправляющийПодсимвол; КонецЕсли; - Цифра = Число(ПодсимволБезChomping); - Если Цифра < 1 ИЛИ Цифра > 9 Тогда + // Проверяем, что это цифра + Попытка + Цифра = Число(ПодсимволБезChomping); + Если Цифра < 1 ИЛИ Цифра > 9 Тогда + ВызватьИсключение "Индикатор отступа блочного скаляра должен быть цифрой от 1 до 9: " + УправляющийПодсимвол; + КонецЕсли; + Исключение ВызватьИсключение "Индикатор отступа блочного скаляра должен быть цифрой от 1 до 9: " + УправляющийПодсимвол; - КонецЕсли; + КонецПопытки; КонецЕсли; КонецПроцедуры From 7f039e9e527af759b5f119f5528dd0e45bc1221b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 9 Nov 2025 18:52:37 +0000 Subject: [PATCH 7/9] Fix YAML directive validation to allow comments on directive line - Strip comments before validating directive format - Fixes cases like "%YAML 1.3 # comment" which should be valid - Still catches invalid cases like "%YAML 1.1#comment" (no space before #) Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...0\270\320\267\320\260\321\202\320\276\321\200.os" | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 6e23589..682846a 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -363,10 +363,18 @@ ВызватьИсключение "Дублирование YAML директивы не допускается"; КонецЕсли; + // Удаляем комментарий из строки для валидации + ПозицияКомментария = СтрНайти(СтрокаБезПробелов, "#"); + Если ПозицияКомментария > 0 Тогда + СтрокаБезКомментария = СокрЛП(Лев(СтрокаБезПробелов, ПозицияКомментария - 1)); + Иначе + СтрокаБезКомментария = СтрокаБезПробелов; + КонецЕсли; + // Валидируем формат YAML директивы - ЧастиДирективы = СтрРазделить(СтрокаБезПробелов, " ", Истина); + ЧастиДирективы = СтрРазделить(СтрокаБезКомментария, " ", Истина); Если ЧастиДирективы.Количество() > 2 Тогда - ВызватьИсключение "YAML директива содержит лишние слова: " + СтрокаБезПробелов; + ВызватьИсключение "YAML директива содержит лишние слова: " + СтрокаБезКомментария; ИначеЕсли ЧастиДирективы.Количество() < 2 Тогда ВызватьИсключение "YAML директива должна содержать версию"; КонецЕсли; From b5c4fe56b3ca4546f163ee05fc964a23c7d3fa11 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Nov 2025 11:50:26 +0000 Subject: [PATCH 8/9] Add tab validation in indentation contexts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Modified ОпределитьОтступ() to detect and reject tabs in indentation - Tabs are not allowed for indentation per YAML spec - Fixes 5 tests: DK95/06, 4EJS, Y79Y/000, Y79Y/004, Y79Y/005 - Tests that have tabs in content (not indentation) remain unaffected Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...0\273\320\270\320\267\320\260\321\202\320\276\321\200.os" | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 682846a..404add4 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -4140,8 +4140,11 @@ Символ = Сред(Строка, а, 1); Если Символ = " " Тогда Отступ = Отступ + 1; + ИначеЕсли Символ = Символы.Таб Тогда + // Табуляция в отступе недопустима по спецификации YAML + ВызватьИсключение "Табуляция не может использоваться для отступа в YAML"; Иначе - // Встретили любой не-пробельный символ (включая таб) - отступ закончился + // Встретили любой другой не-пробельный символ - отступ закончился Прервать; КонецЕсли; КонецЦикла; From 4f31bdff8a270b05c8216218ddaa0ddecf75fd06 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:10:01 +0000 Subject: [PATCH 9/9] Revert overly aggressive tab validation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous tab validation in ОпределитьОтступ was too broad - it rejected tabs in all contexts including valid ones like tabs in block scalar content. This caused additional test failures. Reverting to allow proper targeted implementation. Co-authored-by: Segate-ekb <80944823+Segate-ekb@users.noreply.github.com> --- ...0\273\320\270\320\267\320\260\321\202\320\276\321\200.os" | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" index 404add4..682846a 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200.os" @@ -4140,11 +4140,8 @@ Символ = Сред(Строка, а, 1); Если Символ = " " Тогда Отступ = Отступ + 1; - ИначеЕсли Символ = Символы.Таб Тогда - // Табуляция в отступе недопустима по спецификации YAML - ВызватьИсключение "Табуляция не может использоваться для отступа в YAML"; Иначе - // Встретили любой другой не-пробельный символ - отступ закончился + // Встретили любой не-пробельный символ (включая таб) - отступ закончился Прервать; КонецЕсли; КонецЦикла;