From a0450cf9e5617cf2eda92435ff8b785f45022a15 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 30 Apr 2025 23:06:36 +0300 Subject: [PATCH 01/23] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2?= =?UTF-8?q?=20=D0=B8=D0=B3=D0=BD=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 62869e8..922e08b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.ospx tests.xml +oscript_modules From 2f8ab4833874c5fc267666668d0d804ca2a1755e Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Wed, 30 Apr 2025 23:28:25 +0300 Subject: [PATCH 02/23] =?UTF-8?q?=D0=91=D0=B0=D0=BC=D0=BF=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packagedef b/packagedef index 550f59b..cc666d2 100644 --- a/packagedef +++ b/packagedef @@ -4,7 +4,7 @@ // Описание.Имя("semver") - .Версия("0.5.2") + .Версия("0.6.0") .Автор("Khorev Aleksey") .АдресАвтора("Khorevaa@gmail.com") .Описание("Эта библиотека облегчает работу с семантическими версиями") @@ -15,11 +15,8 @@ .ЗависитОт("logos") .ЗависитОт("strings") .ЗависитОт("fluent") - //.ЗависитОт("package3", ">=1.1", "<2.0") - //.ЗависитОт("package4", ">=1.1", "<2.0") .ОпределяетМодуль("Версии", "src/core/Модули/Версии.os") .ОпределяетКласс("Версия", "src/core/Классы/Версия.os") .ОпределяетКласс("ДиапазонВерсий", "src/core/Классы/ДиапазонВерсий.os") .ОпределяетКласс("СравнениеВерсий", "src/core/Классы/СравнениеВерсий.os") - //.ОпределяетМодуль("ПолезныеФункции", "src/tools.os") ; From 3cedf48bb549e8d7e1e57daa22c7e9ea73466400 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Thu, 1 May 2025 22:56:54 +0300 Subject: [PATCH 03/23] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D1=81=D0=B5=D1=80=20=D1=81=D0=B5=D0=B3=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\200\321\201\320\270\321\217.os" | 81 +++++++------- ...20\265\321\200\321\201\320\270\320\270.os" | 104 ++++++++++++++++++ tests/versionParserTest.os | 86 +++++++++++++++ 3 files changed, 233 insertions(+), 38 deletions(-) create mode 100644 "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" create mode 100644 tests/versionParserTest.os diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 5d70c16..590a21f 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -173,64 +173,69 @@ ВерсияСтрокой = ПодготовитьКЧтению(ВерсияСтрокой); - МассивСтрокВерсии = СтрРазделить(ВерсияСтрокой, "."); + Парсер = Новый ПарсерВерсии(ВерсияСтрокой); - Если МассивСтрокВерсии.Количество() < 3 Тогда - ОшибкаЧтенияВерсии = "Не найдены все составляющие версии"; - Возврат; - КонецЕсли; - - СтрокаОсновнаяВерсия = МассивСтрокВерсии[0]; + // Чтение основной + Токен = Парсер.Следующий(); - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаОсновнаяВерсия) Тогда - - ОшибкаЧтенияВерсии = СтрШаблон("Основная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); - Возврат; - + Если Токен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; КонецЕсли; - Основная = Число(СтрокаОсновнаяВерсия); - - СтрокаВторостепеннаяВерсия = МассивСтрокВерсии[1]; + Если Токен.Тип = Парсер.ТипЧисло Тогда + Основная = Число(Токен.Значение); + Иначе + ОшибкаЧтенияВерсии = СтрШаблон("Основная версия <%1> должна содержать только цифры", Токен.Значение); + Возврат; + КонецЕсли; + // Чтение второстепенной + Токен = Парсер.Следующий(); - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаВторостепеннаяВерсия) Тогда - - ОшибкаЧтенияВерсии = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); - Возврат; - + Если Токен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; + ИначеЕсли Токен.Значение <> "." Тогда + ОшибкаЧтенияВерсии = СтрШаблон("Ожидается разделитель разрядов версии <.>, но найдено <%1>", Токен.Значение); + Возврат; + Иначе + Токен = Парсер.Следующий(); КонецЕсли; - Второстепенная = Число(СтрокаВторостепеннаяВерсия); + Если Токен.Тип = Парсер.ТипЧисло Тогда + Второстепенная = Число(Токен.Значение); + Иначе + ОшибкаЧтенияВерсии = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры", Токен.Значение); + Возврат; + КонецЕсли; - СтрокаПатчаВерсии = МассивСтрокВерсии[2]; + // Чтение патча + Токен = Парсер.Следующий(); - Если Не СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаПатчаВерсии) Тогда - - ОшибкаЧтенияВерсии = СтрШаблон("Версия патча <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); - Возврат; - + Если Токен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; + ИначеЕсли Токен.Значение <> "." Тогда + ОшибкаЧтенияВерсии = СтрШаблон("Ожидается разделитель разрядов версии <.>, но найдено <%1>", Токен.Значение); + Возврат; + Иначе + Токен = Парсер.Следующий(); КонецЕсли; - Патч = Число(СтрокаПатчаВерсии); + Если Токен.Тип = Парсер.ТипЧисло Тогда + Патч = Число(Токен.Значение); + Иначе + ОшибкаЧтенияВерсии = СтрШаблон("Версия патча <%1> должна содержать только цифры", Токен.Значение); + Возврат; + КонецЕсли; КонецПроцедуры Функция ПодготовитьКЧтению(Знач СтрокаВерсии) Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда - СтрокаВерсии = СтрЗаменить(СтрокаВерсии, "v", ""); + СтрокаВерсии = Сред(СтрокаВерсии, 2); КонецЕсли; - МассивСтрокВерсии = СтрРазделить(СтрокаВерсии, "."); - - КоличествоДобавления = 3 - МассивСтрокВерсии.Количество(); - - Для ИИ = 1 ПО КоличествоДобавления Цикл - МассивСтрокВерсии.Добавить(0); - КонецЦикла; - - Возврат СтрСоединить(МассивСтрокВерсии, "."); + Возврат СтрокаВерсии; КонецФункции diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" new file mode 100644 index 0000000..57d2892 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -0,0 +1,104 @@ +Перем СтрокаДляРазбора; +Перем Индекс; + +Перем ТипКонецТекста Экспорт; +Перем ТипЧисло Экспорт; +Перем ТипТекст Экспорт; +Перем ТипРазделитель Экспорт; +Перем ТипОшибка Экспорт; + +Перем ДиапазонЧислоНачало; +Перем ДиапазонЧислоКонец; + +Перем ДиапазонЗаглавныеБуквыНачало; +Перем ДиапазонЗаглавныеБуквыКонец; +Перем ДиапазонСтрочныеБуквыНачало; +Перем ДиапазонСтрочныеБуквыКонец; +Перем Дефис; +Перем Плюс; +Перем Точка; + +Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой) + СтрокаДляРазбора = ВерсияСтрокой; + Если ПустаяСтрока(СтрокаДляРазбора) Тогда + Индекс = -1; + Иначе + Индекс = 1; + КонецЕсли; +КонецПроцедуры + +Функция Токен(Знач Значение, Знач Тип) + Возврат Новый Структура("Тип, Значение", Тип, Значение); +КонецФункции + +Функция Следующий() Экспорт + + Если Индекс = -1 Тогда + Возврат Токен("", ТипКонецТекста); + КонецЕсли; + + ТипТокена = ТипЧисло; + НачалоЗначения = Индекс; + ЧислоСимволов = 0; + + Пока Истина Цикл + + Символ = Сред(СтрокаДляРазбора, Индекс, 1); + КодСимвола = КодСимвола(Символ); + Если ПустаяСтрока(Символ) Тогда + Если ЧислоСимволов = 0 Тогда + // Это последний прочитанный токен + Индекс = -1; + Возврат Токен("", ТипКонецТекста); + КонецЕсли; + Прервать; + КонецЕсли; + + // Инлайн, чтобы было побыстрее и не тратило время на вызов метода + Если (КодСимвола >= ДиапазонЗаглавныеБуквыНачало И КодСимвола <= ДиапазонЗаглавныеБуквыКонец) ИЛИ + (КодСимвола >= ДиапазонСтрочныеБуквыНачало И КодСимвола <= ДиапазонСтрочныеБуквыКонец) Тогда + ТипТокена = ТипТекст; + ИначеЕсли КодСимвола >= ДиапазонЧислоНачало И КодСимвола <= ДиапазонЧислоКонец Тогда + // обработка числа + ИначеЕсли КодСимвола = Точка ИЛИ КодСимвола = Дефис ИЛИ КодСимвола = Плюс Тогда + // разделитель + Прервать; + Иначе + // ошибка + Позиция = Индекс; + Индекс = -1; // блокировка парсера + Возврат Токен(СтрШаблон("Недопустимый символ '%1' в позиции %2", Символ, Позиция), ТипОшибка); + КонецЕсли; + + Индекс = Индекс + 1; + ЧислоСимволов = ЧислоСимволов + 1; + КонецЦикла; + + Если ЧислоСимволов = 0 Тогда + // Это разделитель + Значение = Сред(СтрокаДляРазбора, Индекс, 1); + Индекс = Индекс + 1; + Возврат Токен(Значение, ТипРазделитель); + КонецЕсли; + + Значение = Сред(СтрокаДляРазбора, НачалоЗначения, ЧислоСимволов); + + Возврат Токен(Значение, ТипТокена); + +КонецФункции + +ТипКонецТекста = 0; +ТипЧисло = 1; +ТипТекст = 2; +ТипРазделитель = 3; +ТипОшибка = 4; + +ДиапазонЧислоНачало = 48; +ДиапазонЧислоКонец = 57; +ДиапазонЗаглавныеБуквыНачало = 65; +ДиапазонЗаглавныеБуквыКонец = 90; +ДиапазонСтрочныеБуквыНачало = 97; +ДиапазонСтрочныеБуквыКонец = 122; +Дефис = КодСимвола("-"); +Плюс = КодСимвола("+"); +Точка = КодСимвола("."); \ No newline at end of file diff --git a/tests/versionParserTest.os b/tests/versionParserTest.os new file mode 100644 index 0000000..270336f --- /dev/null +++ b/tests/versionParserTest.os @@ -0,0 +1,86 @@ +&Тест +Процедура ПроверитьПарсерВерсии() Экспорт + + Парсер = Новый ПарсерВерсии("...+-2.1.22.00.dff-3dfg.12.fgg-fdf"); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "+", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + + ПроверитьТокен(Парсер.Следующий(), "2", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "1", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "22", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "00", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "dff", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "3dfg", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "12", Парсер.ТипЧисло); + + ПроверитьТокен(Парсер.Следующий(), ".", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "fgg", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "fdf", Парсер.ТипТекст); + + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + +КонецПроцедуры + +&Тест +Процедура ПроверитьЗаканчивающеесяНаРазделитель() Экспорт + Парсер = Новый ПарсерВерсии("23-"); + + ПроверитьТокен(Парсер.Следующий(), "23", Парсер.ТипЧисло); + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + +&Тест +Процедура ПроверитьЕдиничноеЧисло() Экспорт + Парсер = Новый ПарсерВерсии("23"); + + ПроверитьТокен(Парсер.Следующий(), "23", Парсер.ТипЧисло); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + +&Тест +Процедура ПроверитьЕдиничныйТекст() Экспорт + Парсер = Новый ПарсерВерсии("a23"); + + ПроверитьТокен(Парсер.Следующий(), "a23", Парсер.ТипТекст); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + + +&Тест +Процедура ПроверитьОшибку() Экспорт + Парсер = Новый ПарсерВерсии("a23-%^"); + + ПроверитьТокен(Парсер.Следующий(), "a23", Парсер.ТипТекст); + ПроверитьТокен(Парсер.Следующий(), "-", Парсер.ТипРазделитель); + ПроверитьТокен(Парсер.Следующий(), "Недопустимый символ '%' в позиции 5", Парсер.ТипОшибка); + ПроверитьТокен(Парсер.Следующий(), "", Парсер.ТипКонецТекста); +КонецПроцедуры + +Процедура ПроверитьТокен(Знач Токен, Знач Значение, Знач Тип) + Ожидаем.Что(Токен.Значение).Равно(Значение); + Ожидаем.Что(Токен.Тип).Равно(Тип); +КонецПроцедуры \ No newline at end of file From 4b2545fc9dae8d54d7f3dad926ed43360f7c7d0d Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Thu, 1 May 2025 23:43:38 +0300 Subject: [PATCH 04/23] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=B0=D0=B7=20=D0=BE?= =?UTF-8?q?=D1=82=20fluent=20=D0=B2=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B5?= =?UTF-8?q?=20=D0=BC=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=D1=83=D0=BC=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 1 - ...320\222\320\265\321\200\321\201\320\270\320\270.os" | 10 +++++++--- ...22\320\265\321\200\321\201\320\270\320\270_test.os" | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packagedef b/packagedef index cc666d2..0001bdd 100644 --- a/packagedef +++ b/packagedef @@ -14,7 +14,6 @@ .ВключитьФайл("tests") .ЗависитОт("logos") .ЗависитОт("strings") - .ЗависитОт("fluent") .ОпределяетМодуль("Версии", "src/core/Модули/Версии.os") .ОпределяетКласс("Версия", "src/core/Классы/Версия.os") .ОпределяетКласс("ДиапазонВерсий", "src/core/Классы/ДиапазонВерсий.os") diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" index befce21..7015e2c 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -45,10 +45,14 @@ Лог.Отладка("Выбираю максимум из [%1]", МассивВерсий.Количество()); - Коллекция = ПроцессорыКоллекций.ИзКоллекции(МассивВерсий); - Результат = Коллекция.Максимум("Результат = Элемент1.Больше(Элемент2)"); + ТекущийМаксимум = МассивВерсий[0]; + Для Сч = 1 По МассивВерсий.ВГраница() Цикл + Если МассивВерсий[Сч].Больше(ТекущийМаксимум) Тогда + ТекущийМаксимум = МассивВерсий[Сч]; + КонецЕсли; + КонецЦикла; - Возврат Результат; + Возврат ТекущийМаксимум; КонецФункции diff --git "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" index fda920f..f320f61 100644 --- "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" +++ "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" @@ -54,7 +54,7 @@ ТестовыеСлучаи.Добавить(ТестовыйСлучай("1.0.0 1.0.1 1.1.2 1.1 2.0", ">=1.0.0, 1.x", "1.1.2")); Для каждого Тест Из ТестовыеСлучаи Цикл - Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.ВерсииПроверки, ",")); + Лог.Отладка("Проверяю тестовый случай: %1", СтрСоединить(Тест.ВерсииПроверки, " ")); Лог.Отладка(" >> диапазоны теста: %1", СтрСоединить(Тест.Диапазон, ",")); Диапазон = Версии.Сравнение(); @@ -67,7 +67,7 @@ .ПроверяемыеВерсии(Тест.ВерсииПроверки) .Максимальная(); - Утверждения.ПроверитьРавенство(ИтоговаяВерсия.ВСтроку(), Тест.Результат[0], "Результат должен совпадать с ожиданиями."); + Утверждения.ПроверитьРавенство(Тест.Результат[0], ИтоговаяВерсия.ВСтроку(), "Результат должен совпадать с ожиданиями."); КонецЦикла From b104f24ed932961b08e4e25dd5fa2082bafc7ec7 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Fri, 2 May 2025 10:33:02 +1000 Subject: [PATCH 05/23] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\320\222\320\265\321\200\321\201\320\270\320\270.os" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" index befce21..49a0746 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -46,7 +46,9 @@ Лог.Отладка("Выбираю максимум из [%1]", МассивВерсий.Количество()); Коллекция = ПроцессорыКоллекций.ИзКоллекции(МассивВерсий); - Результат = Коллекция.Максимум("Результат = Элемент1.Больше(Элемент2)"); + Результат = Коллекция.Максимум( + "(Элемент1, Элемент2) -> Элемент1.Сравнить(Элемент2)" + ); Возврат Результат; From ad992196e8974734cabb0d048eedee9bae364967 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Fri, 2 May 2025 17:48:58 +1000 Subject: [PATCH 06/23] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BD=D1=8F=D1=82?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BE=D1=82=20=D0=B4=D0=B2=D0=B8=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BE=D1=82=20flu?= =?UTF-8?q?ent=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?workflow=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=BF=D1=83=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8=20=D1=80=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=20=D0=A0=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B9=20=D0=BF=D0=BE=D0=B4=D1=87=D0=B8=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BE=D1=82=20=D0=BD=D0=B5=D0=B0=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 15 ++++++++ .github/workflows/testing.yml | 16 ++++++++ .gitignore | 3 ++ .travis.yml | 63 -------------------------------- VERSION | 1 - packagedef | 10 ++--- tasks/coverage.os | 32 ++++++++++++++++ tasks/oscript.cfg | 1 + tasks/test.os | 69 ++++++++--------------------------- travis-ci.sh | 8 ---- 10 files changed, 86 insertions(+), 132 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/testing.yml delete mode 100644 .travis.yml delete mode 100644 VERSION create mode 100644 tasks/coverage.os create mode 100644 tasks/oscript.cfg delete mode 100644 travis-ci.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f3f915e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,15 @@ +name: Публикация релиза + +on: + release: + types: + - published + workflow_dispatch: + +jobs: + release: + uses: autumn-library/workflows/.github/workflows/release.yml@main + with: + package_mask: "semver-*.ospx" + secrets: + PUSH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..6d5ed9f --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,16 @@ +name: Тестирование + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + test: + strategy: + fail-fast: false + matrix: + oscript_version: ['dev', 'lts-dev', 'default'] + uses: autumn-library/workflows/.github/workflows/test.yml@main + with: + oscript_version: ${{ matrix.oscript_version }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 62869e8..b4be030 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ *.ospx tests.xml +oscript_modules/ +build/ +out/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 34f1503..0000000 --- a/.travis.yml +++ /dev/null @@ -1,63 +0,0 @@ -sudo: required - -notifications: - email: false -env: - global: - - CHANNEL=dev - -services: - - docker - -before_install: - # Load cached docker images - - if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi - -before_cache: - # Save tagged docker images - - > - mkdir -p $HOME/docker && docker images -a --filter='dangling=false' --format '{{.Repository}}:{{.Tag}} {{.ID}}' - | xargs -n 2 -t sh -c 'test -e $HOME/docker/$1.tar.gz || docker save $0 | gzip -2 > $HOME/docker/$1.tar.gz' - -install: - - docker pull evilbeaver/onescript:1.0.19 - -cache: - directories: - - '$HOME/.m2/repository' - - '$HOME/.sonar/cache' - - '$HOME/docker' -jobs: - include: - - stage: Тестирование - script: - - docker version - - docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; sh /work_dir/travis-ci.sh; exit' | tee /tmp/test.log - - grep 'Результат прогона тестов <Да>' /tmp/test.log - after_success: - - bash <(curl -s https://codecov.io/bash) - - - stage: Сборка и публикация github & hub.oscript.io - script: skip - before_deploy: - - docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm build ./ ; exit' - deploy: - - provider: releases - api_key: "$GITHUB_OAUTH_TOKEN" - file_glob: true - file: semver*.ospx - skip_cleanup: true - on: - branch: master - tags: true - - provider: script - skip_cleanup: true - script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel dev --file ./semver-*.ospx; exit' - on: - branch: develop - - provider: script - skip_cleanup: true - script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel stable --file ./semver-*.ospx; exit' - on: - branch: master - tags: true \ No newline at end of file diff --git a/VERSION b/VERSION deleted file mode 100644 index 79a2734..0000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.5.0 \ No newline at end of file diff --git a/packagedef b/packagedef index 550f59b..5b1ad2c 100644 --- a/packagedef +++ b/packagedef @@ -4,22 +4,20 @@ // Описание.Имя("semver") - .Версия("0.5.2") + .Версия("0.6.0") .Автор("Khorev Aleksey") .АдресАвтора("Khorevaa@gmail.com") .Описание("Эта библиотека облегчает работу с семантическими версиями") - .ВерсияСреды("1.0.18") + .ВерсияСреды("1.9.2") .ВключитьФайл("src") .ВключитьФайл("doc") .ВключитьФайл("tests") .ЗависитОт("logos") .ЗависитОт("strings") - .ЗависитОт("fluent") - //.ЗависитОт("package3", ">=1.1", "<2.0") - //.ЗависитОт("package4", ">=1.1", "<2.0") + .ЗависитОт("fluent", "0.6.1") + .РазработкаЗависитОт("1testrunner", "1.9.2") .ОпределяетМодуль("Версии", "src/core/Модули/Версии.os") .ОпределяетКласс("Версия", "src/core/Классы/Версия.os") .ОпределяетКласс("ДиапазонВерсий", "src/core/Классы/ДиапазонВерсий.os") .ОпределяетКласс("СравнениеВерсий", "src/core/Классы/СравнениеВерсий.os") - //.ОпределяетМодуль("ПолезныеФункции", "src/tools.os") ; diff --git a/tasks/coverage.os b/tasks/coverage.os new file mode 100644 index 0000000..f5a6558 --- /dev/null +++ b/tasks/coverage.os @@ -0,0 +1,32 @@ +#Использовать coverage +#Использовать 1commands +#Использовать fs + +СистемнаяИнформация = Новый СистемнаяИнформация; +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + +ФС.ОбеспечитьПустойКаталог(ОбъединитьПути("build", "coverage")); +ПутьКСтат = ОбъединитьПути("build", "coverage", "stat.json"); + +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); +Если НЕ ЭтоWindows Тогда + Команда.ДобавитьПараметр("-encoding=utf-8"); +КонецЕсли; +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр(ОбъединитьПути("tasks", "test.os")); +Команда.ПоказыватьВыводНемедленно(Истина); + +КодВозврата = Команда.Исполнить(); + +ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); + +ПроцессорГенерации.ОтносительныеПути() + .РабочийКаталог(ОбъединитьПути("build", "coverage")) + .КаталогИсходников(ТекущийКаталог()) + .ИмяФайлаСтатистики() + .GenericCoverage() + .Cobertura() + .Сформировать(); + +ЗавершитьРаботу(КодВозврата); diff --git a/tasks/oscript.cfg b/tasks/oscript.cfg new file mode 100644 index 0000000..874f3d2 --- /dev/null +++ b/tasks/oscript.cfg @@ -0,0 +1 @@ +lib.system=../oscript_modules diff --git a/tasks/test.os b/tasks/test.os index 3edf7de..43bba03 100644 --- a/tasks/test.os +++ b/tasks/test.os @@ -1,84 +1,45 @@ -#Использовать "../src/core" -#Использовать 1bdd #Использовать 1testrunner +#Использовать fs Функция ПрогнатьТесты() - + Тестер = Новый Тестер; + Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); + Тестер.ПодробныеОписанияОшибок(Истина); - ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); - ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); + ПутьКТестам = "tests"; + ПутьКОтчетуJUnit = ОбъединитьПути("build", "testsResults"); - КаталогТестов = Новый Файл(ПутьКТестам); - Если Не КаталогТестов.Существует() Тогда - Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам)); - Возврат Истина; - КонецЕсли; + ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); РезультатТестирования = Тестер.ТестироватьКаталог( - КаталогТестов, + Новый Файл(ПутьКТестам), Новый Файл(ПутьКОтчетуJUnit) ); Успешно = РезультатТестирования = 0; - - Возврат Успешно; -КонецФункции // ПрогнатьТесты() - -Функция ПрогнатьФичи() - - ПутьОтчетаJUnit = "./bdd-log.xml"; - - КаталогФич = ОбъединитьПути(".", "features"); - - Файл_КаталогФич = Новый Файл(КаталогФич); - Если Не Файл_КаталогФич.Существует() Тогда - Сообщить(СтрШаблон("Не найден каталог фич %1", КаталогФич)); - Возврат Истина; - КонецЕсли; - ИсполнительБДД = Новый ИсполнительБДД; - РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); - ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); - - СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; - Если РезультатыВыполнения.Строки.Количество() > 0 Тогда - - СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); - - КонецЕсли; + Возврат Успешно; - ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; - ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); +КонецФункции // ПрогнатьТесты() - Сообщить(СтрШаблон("Результат прогона фич <%1> - |", ИтоговыйРезультатВыполнения)); +// основной код - Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; -КонецФункции // ПрогнатьФичи() +ТекКаталог = ТекущийКаталог(); Попытка ТестыПрошли = ПрогнатьТесты(); - Исключение ТестыПрошли = Ложь; Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; -ФичиПрошли = Истина; - -// Попытка -// ФичиПрошли = ПрогнатьФичи(); -// Исключение -// ФичиПрошли = Ложь; -// Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно -// |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); -// КонецПопытки; +УстановитьТекущийКаталог(ТекКаталог); -Если Не ТестыПрошли Или Не ФичиПрошли Тогда +Если Не ТестыПрошли Тогда ВызватьИсключение "Тестирование завершилось неудачно!"; Иначе Сообщить(СтрШаблон("Результат прогона тестов <%1> |", ТестыПрошли)); -КонецЕсли; \ No newline at end of file +КонецЕсли; diff --git a/travis-ci.sh b/travis-ci.sh deleted file mode 100644 index 8b8ad79..0000000 --- a/travis-ci.sh +++ /dev/null @@ -1,8 +0,0 @@ - -opm install 1testrunner; -opm install 1bdd; -opm install; - -opm test; - - From 9b33f597911cd4cbf0a91cd44309143b2f37a4a5 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 2 May 2025 15:29:18 +0300 Subject: [PATCH 07/23] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=D0=BD=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D1=81=D0=B5=D1=80=20=D1=81=D0=B5=D0=BC=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 20 +++ packagedef | 2 +- ...20\265\321\200\321\201\320\270\321\217.os" | 169 +++++++++++++++--- ...20\265\321\200\321\201\320\270\320\270.os" | 20 ++- tests/preReleasesTests.os | 39 ++++ 5 files changed, 225 insertions(+), 25 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 tests/preReleasesTests.os diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..57dbd51 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Отладка 1Script", + "type": "oscript", + "request": "launch", + "program": "tests/temp.os", + "args": [], + "cwd": "${workspaceRoot}", + "env": {}, + "runtimeExecutable": null, + "runtimeArgs": [], + "debugPort": 2801 + } + ] +} \ No newline at end of file diff --git a/packagedef b/packagedef index 7ec855e..3609b09 100644 --- a/packagedef +++ b/packagedef @@ -4,7 +4,7 @@ // Описание.Имя("semver") - .Версия("0.6.0") + .Версия("1.0.0") .Автор("Khorev Aleksey") .АдресАвтора("Khorevaa@gmail.com") .Описание("Эта библиотека облегчает работу с семантическими версиями") diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 590a21f..4297417 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -8,7 +8,7 @@ Перем Патч Экспорт; // число Перем ПреРелиз Экспорт; // Массив -Перем НомерБилда Экспорт; // Массив; +Перем МетаданныеСборки Экспорт; // Массив; Перем ОшибкаЧтенияВерсии Экспорт; Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой) @@ -17,6 +17,7 @@ Второстепенная = 0; Патч = 0; ПреРелиз = Новый Массив; + МетаданныеСборки = Новый Массив; Прочитать(ВерсияСтрокой); @@ -47,6 +48,14 @@ Функция ВСтроку() Экспорт СтрокаВерсии = СтрШаблон("%1.%2.%3", Строка(Основная), Строка(Второстепенная), Строка(Патч)); + + Если ПреРелиз.Количество() Тогда + СтрокаВерсии = СтрокаВерсии + "-" + СтрСоединить(ПреРелиз, "."); + КонецЕсли; + + Если МетаданныеСборки.Количество() Тогда + СтрокаВерсии = СтрокаВерсии + "+" + СтрСоединить(МетаданныеСборки, "."); + КонецЕсли; Возврат СтрокаВерсии; @@ -64,7 +73,7 @@ Если НЕ Основная = ВходящаяВерсия.Основная Тогда - Возврат ?(Основная > ВходящаяВерсия.Основная,1,-1); + Возврат ?(Основная > ВходящаяВерсия.Основная, 1,-1); КонецЕсли; @@ -174,59 +183,173 @@ ВерсияСтрокой = ПодготовитьКЧтению(ВерсияСтрокой); Парсер = Новый ПарсерВерсии(ВерсияСтрокой); + Парсер.Следующий(); + + Попытка + ПрочитатьОсновную(Парсер); + ПрочитатьРазделитель(Парсер, "."); + ПрочитатьВторостепенную(Парсер); + ПрочитатьРазделитель(Парсер, "."); + ПрочитатьПатч(Парсер); + ПрочитатьХвостовыеМассивы(Парсер); + Исключение + ОшибкаЧтенияВерсии = ИнформацияОбОшибке().Описание; + КонецПопытки; + +КонецПроцедуры + +Процедура ПрочитатьОчереднойРазделитель(Знач Парсер, Знач Разделитель) + + ТекущийТокен = Парсер.Следующий(); + Если ТекущийТокен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; + КонецЕсли; + + Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда + Если Разделитель = ТекущийТокен.Значение Тогда + СледующийТокен = Парсер.Следующий(); + Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда + ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель); + КонецЕсли; + Возврат; + КонецЕсли; + КонецЕсли; + + ВызватьИсключение СтрШаблон("Ожидается разделитель <%1>, но получен <%2>", Разделитель, ТекущийТокен.Значение); + +КонецПроцедуры + +Процедура ПрочитатьРазделитель(Знач Парсер, Знач Разделитель) + + ТекущийТокен = Парсер.Текущий(); + Если ТекущийТокен.Тип = Парсер.ТипКонецТекста Тогда + Возврат; + КонецЕсли; - // Чтение основной - Токен = Парсер.Следующий(); + Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда + Если Разделитель = ТекущийТокен.Значение Тогда + СледующийТокен = Парсер.Следующий(); + Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда + ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель); + КонецЕсли; + Возврат; + КонецЕсли; + КонецЕсли; + + ВызватьИсключение СтрШаблон("Ожидается разделитель <%1>, но получен <%2>", Разделитель, ТекущийТокен.Значение); +КонецПроцедуры + +Процедура ПрочитатьОсновную(Знач Парсер) + Токен = Парсер.Текущий(); Если Токен.Тип = Парсер.ТипКонецТекста Тогда Возврат; КонецЕсли; Если Токен.Тип = Парсер.ТипЧисло Тогда Основная = Число(Токен.Значение); + ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда + ВызватьИсключение Токен.Значение; Иначе - ОшибкаЧтенияВерсии = СтрШаблон("Основная версия <%1> должна содержать только цифры", Токен.Значение); - Возврат; + ВызватьИсключение СтрШаблон("Основная версия <%1> должна содержать только цифры", Токен.Значение); КонецЕсли; - // Чтение второстепенной - Токен = Парсер.Следующий(); + Парсер.Следующий(); +КонецПроцедуры +Процедура ПрочитатьВторостепенную(Знач Парсер) + Токен = Парсер.Текущий(); Если Токен.Тип = Парсер.ТипКонецТекста Тогда Возврат; - ИначеЕсли Токен.Значение <> "." Тогда - ОшибкаЧтенияВерсии = СтрШаблон("Ожидается разделитель разрядов версии <.>, но найдено <%1>", Токен.Значение); - Возврат; - Иначе - Токен = Парсер.Следующий(); КонецЕсли; Если Токен.Тип = Парсер.ТипЧисло Тогда Второстепенная = Число(Токен.Значение); + ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда + ВызватьИсключение Токен.Значение; Иначе - ОшибкаЧтенияВерсии = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры", Токен.Значение); - Возврат; + ВызватьИсключение СтрШаблон("Второстепенная версия <%1> должна содержать только цифры", Токен.Значение); КонецЕсли; - // Чтение патча - Токен = Парсер.Следующий(); + Парсер.Следующий(); +КонецПроцедуры +Процедура ПрочитатьПатч(Знач Парсер) + Токен = Парсер.Текущий(); Если Токен.Тип = Парсер.ТипКонецТекста Тогда Возврат; - ИначеЕсли Токен.Значение <> "." Тогда - ОшибкаЧтенияВерсии = СтрШаблон("Ожидается разделитель разрядов версии <.>, но найдено <%1>", Токен.Значение); - Возврат; - Иначе - Токен = Парсер.Следующий(); КонецЕсли; Если Токен.Тип = Парсер.ТипЧисло Тогда Патч = Число(Токен.Значение); + ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда + ВызватьИсключение Токен.Значение; Иначе - ОшибкаЧтенияВерсии = СтрШаблон("Версия патча <%1> должна содержать только цифры", Токен.Значение); + ВызватьИсключение СтрШаблон("Версия патча <%1> должна содержать только цифры", Токен.Значение); + КонецЕсли; + + Парсер.Следующий(); +КонецПроцедуры + +Процедура ПрочитатьХвостовыеМассивы(Знач Парсер) + Токен = Парсер.Текущий(); + Если Токен.Тип = Парсер.ТипКонецТекста Тогда Возврат; КонецЕсли; + Если Токен.Тип <> Парсер.ТипРазделитель или Токен.Значение = "." Тогда + ВызватьИсключение "Ожидается разделитель пререлизной версии <-> или метаданных сборки <+>, получен <" + Токен.Значение + ">"; + КонецЕсли; + + ПрочитатьПреРелиз(Парсер); + ПрочитатьМетаданныеСборки(Парсер); + +КонецПроцедуры + +Процедура ПрочитатьПреРелиз(Знач Парсер) + Если Парсер.Текущий().Значение = "-" Тогда + Парсер.Следующий(); + СобратьМассивИзКомпонентов(Парсер, ПреРелиз, "+"); + КонецЕсли; +КонецПроцедуры + +Процедура ПрочитатьМетаданныеСборки(Знач Парсер) + Если Парсер.Текущий().Значение = "+" Тогда + Парсер.Следующий(); + СобратьМассивИзКомпонентов(Парсер, МетаданныеСборки, ""); + КонецЕсли; +КонецПроцедуры + +Процедура СобратьМассивИзКомпонентов(Знач Парсер, Знач МассивКомпонентов, Знач ПрерватьПо) + + Пока Истина Цикл + ПрочитатьКомпонент(Парсер, МассивКомпонентов); + Если Парсер.Текущий().Значение = ПрерватьПо или Парсер.Текущий().Тип = Парсер.ТипКонецТекста Тогда + Прервать; + КонецЕсли; + + ПрочитатьРазделитель(Парсер, "."); + + КонецЦикла; + +КонецПроцедуры + +Процедура ПрочитатьКомпонент(Знач Парсер, Знач МассивКомпонентов) + Токен = Парсер.Текущий(); + Если Токен.Тип = Парсер.ТипЧисло Тогда + МассивКомпонентов.Добавить(Токен.Значение); + Парсер.Следующий(); + ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда + Текст = Токен.Значение; + ТекТокен = Парсер.Следующий(); + Пока ТекТокен.Тип = Текст или ТекТокен.Значение = "-" Цикл + Текст = Текст + ТекТокен.Значение; + Парсер.Следующий(); + КонецЦикла; + МассивКомпонентов.Добавить(Текст); + Иначе + ВызватьИсключение СтрШаблон("Ожидается компонент версии, но получен <%1>", ?(Токен.Значение = "", "EOF", Токен.Значение)); + КонецЕсли; КонецПроцедуры Функция ПодготовитьКЧтению(Знач СтрокаВерсии) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" index 57d2892..c122dda 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\321\201\320\265\321\200\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -18,6 +18,8 @@ Перем Плюс; Перем Точка; +Перем ТекущийТокен; + Процедура ПриСозданииОбъекта(Знач ВерсияСтрокой) СтрокаДляРазбора = ВерсияСтрокой; Если ПустаяСтрока(СтрокаДляРазбора) Тогда @@ -33,6 +35,23 @@ Функция Следующий() Экспорт + ТекущийТокен = ПолучитьСледующий(); + Возврат ТекущийТокен; + +КонецФункции + +Функция Текущий() Экспорт + + Возврат ТекущийТокен; +КонецФункции + +Функция Индекс() Экспорт + + Возврат Индекс; + +КонецФункции + +Функция ПолучитьСледующий() Если Индекс = -1 Тогда Возврат Токен("", ТипКонецТекста); КонецЕсли; @@ -84,7 +103,6 @@ Значение = Сред(СтрокаДляРазбора, НачалоЗначения, ЧислоСимволов); Возврат Токен(Значение, ТипТокена); - КонецФункции ТипКонецТекста = 0; diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os new file mode 100644 index 0000000..4bed501 --- /dev/null +++ b/tests/preReleasesTests.os @@ -0,0 +1,39 @@ +// BSLLS:UnusedLocalMethod-off +#Использовать asserts +#Использовать ".." + +&ПараметризованныйТест(Имя = "Тест с параметрами {Параметры}") +&ИсточникЗначение("1.1.1", "1.1.1") +&ИсточникЗначение("1", "1.0.0") +&ИсточникЗначение("2.0", "2.0.0") +Процедура РелизнаяВерсияВСтроку(ВерсияСтрокой, Ожидание) Экспорт + Версия = Новый Версия(ВерсияСтрокой); + Ожидаем.Что(Версия.ВСтроку()).Равно(Ожидание); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("1.1.1-alpha", "1.1.1-alpha") +&ИсточникЗначение("1.1.1-alpha.1.2", "1.1.1-alpha.1.2") +&ИсточникЗначение("1.1.1-beta.1+abcdef.456", "1.1.1-beta.1+abcdef.456") +Процедура ПреРелизнаяВерсияВСтроку(ВерсияСтрокой, Ожидание) Экспорт + Версия = Новый Версия(ВерсияСтрокой); + Ожидаем.Что(Версия.ВСтроку()).Равно(Ожидание); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение(".1.1", "Основная версия <.> должна содержать только цифры") +&ИсточникЗначение("1..1", "Второстепенная версия <.> должна содержать только цифры") +&ИсточникЗначение("1.2.-", "Версия патча <-> должна содержать только цифры") +&ИсточникЗначение("1.2.", "Неожиданный конец строки версии, нет данных после разделителя <.>") +&ИсточникЗначение("aa1.2.3", "Основная версия должна содержать только цифры") +&ИсточникЗначение("1.1aa.1", "Второстепенная версия <1aa> должна содержать только цифры") +&ИсточникЗначение("1.2.1aa", "Версия патча <1aa> должна содержать только цифры") +&ИсточникЗначение("1.2.1.3", "Ожидается разделитель пререлизной версии <-> или метаданных сборки <+>, получен <.>") +&ИсточникЗначение("1.2.1-", "Ожидается компонент версии, но получен ") +&ИсточникЗначение("1.2.1+", "Ожидается компонент версии, но получен ") +&ИсточникЗначение("1.2.1-beta+", "Ожидается компонент версии, но получен ") +&ИсточникЗначение("1.2.1-beta..1", "Ожидается компонент версии, но получен <.>") +Процедура ПроверитьОшибкиРазбора(ВерсияСтрокой, Ожидание) Экспорт + Версия = Новый Версия(ВерсияСтрокой); + Ожидаем.Что(Версия.ОшибкаЧтенияВерсии).Равно(Ожидание); +КонецПроцедуры From 1a9e7c3a907fb6bf75fdf3c0401599a554a991df Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 2 May 2025 15:43:10 +0300 Subject: [PATCH 08/23] =?UTF-8?q?=D0=9D=D0=B5=D0=BC=D0=BD=D0=BE=D0=B6?= =?UTF-8?q?=D0=BA=D0=BE=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\222\320\265\321\200\321\201\320\270\321\217.os" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 4297417..3d59875 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -323,7 +323,7 @@ Процедура СобратьМассивИзКомпонентов(Знач Парсер, Знач МассивКомпонентов, Знач ПрерватьПо) Пока Истина Цикл - ПрочитатьКомпонент(Парсер, МассивКомпонентов); + МассивКомпонентов.Добавить(ПрочитатьКомпонент(Парсер)); Если Парсер.Текущий().Значение = ПрерватьПо или Парсер.Текущий().Тип = Парсер.ТипКонецТекста Тогда Прервать; КонецЕсли; @@ -334,11 +334,11 @@ КонецПроцедуры -Процедура ПрочитатьКомпонент(Знач Парсер, Знач МассивКомпонентов) +Функция ПрочитатьКомпонент(Знач Парсер) Токен = Парсер.Текущий(); Если Токен.Тип = Парсер.ТипЧисло Тогда - МассивКомпонентов.Добавить(Токен.Значение); Парсер.Следующий(); + Возврат Токен.Значение; ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда Текст = Токен.Значение; ТекТокен = Парсер.Следующий(); @@ -346,11 +346,11 @@ Текст = Текст + ТекТокен.Значение; Парсер.Следующий(); КонецЦикла; - МассивКомпонентов.Добавить(Текст); + Возврат Текст; Иначе ВызватьИсключение СтрШаблон("Ожидается компонент версии, но получен <%1>", ?(Токен.Значение = "", "EOF", Токен.Значение)); КонецЕсли; -КонецПроцедуры +КонецФункции Функция ПодготовитьКЧтению(Знач СтрокаВерсии) From afae911c4c85ecf65a93510a666db9066cdf59bf Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Fri, 2 May 2025 15:48:01 +0300 Subject: [PATCH 09/23] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B2=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=20launch.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 57dbd51..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Отладка 1Script", - "type": "oscript", - "request": "launch", - "program": "tests/temp.os", - "args": [], - "cwd": "${workspaceRoot}", - "env": {}, - "runtimeExecutable": null, - "runtimeArgs": [], - "debugPort": 2801 - } - ] -} \ No newline at end of file From ef1ade35ce0e0047388b8d67c59d810752685c66 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 4 May 2025 11:08:46 +0300 Subject: [PATCH 10/23] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BA=D0=BB=D0=B5=D0=B9=D0=BA=D1=83=20=D0=B4=D0=B5=D1=84=D0=B8?= =?UTF-8?q?=D1=81=D0=BE=D0=B2=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\222\320\265\321\200\321\201\320\270\321\217.os" | 8 ++++---- tests/preReleasesTests.os | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 3d59875..089d802 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -340,11 +340,11 @@ Парсер.Следующий(); Возврат Токен.Значение; ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда - Текст = Токен.Значение; - ТекТокен = Парсер.Следующий(); - Пока ТекТокен.Тип = Текст или ТекТокен.Значение = "-" Цикл + Текст = ""; + ТекТокен = Парсер.Текущий(); + Пока ТекТокен.Тип = Парсер.ТипТекст или ТекТокен.Значение = "-" Цикл Текст = Текст + ТекТокен.Значение; - Парсер.Следующий(); + ТекТокен = Парсер.Следующий(); КонецЦикла; Возврат Текст; Иначе diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os index 4bed501..e0b9a5d 100644 --- a/tests/preReleasesTests.os +++ b/tests/preReleasesTests.os @@ -15,6 +15,7 @@ &ИсточникЗначение("1.1.1-alpha", "1.1.1-alpha") &ИсточникЗначение("1.1.1-alpha.1.2", "1.1.1-alpha.1.2") &ИсточникЗначение("1.1.1-beta.1+abcdef.456", "1.1.1-beta.1+abcdef.456") +&ИсточникЗначение("1.1.0-beta-experimental.4.2+git-sha.deadbeef", "1.1.0-beta-experimental.4.2+git-sha.deadbeef") Процедура ПреРелизнаяВерсияВСтроку(ВерсияСтрокой, Ожидание) Экспорт Версия = Новый Версия(ВерсияСтрокой); Ожидаем.Что(Версия.ВСтроку()).Равно(Ожидание); @@ -37,3 +38,14 @@ Версия = Новый Версия(ВерсияСтрокой); Ожидаем.Что(Версия.ОшибкаЧтенияВерсии).Равно(Ожидание); КонецПроцедуры + +&Тест +Процедура ПроверитьЧтоДефисыВходятВСоставФрагмента() Экспорт + Версия = Новый Версия("1.1.0-beta-experimental.4.2+git-sha.deadbeef"); + + Ожидаем.Что(Версия.ПреРелиз[0]).Равно("beta-experimental"); + Ожидаем.Что(Версия.ПреРелиз[1]).Равно("4"); + Ожидаем.Что(Версия.ПреРелиз[2]).Равно("2"); + Ожидаем.Что(Версия.МетаданныеСборки[0]).Равно("git-sha"); + Ожидаем.Что(Версия.МетаданныеСборки[1]).Равно("deadbeef"); +КонецПроцедуры \ No newline at end of file From 655a9839fa2464a5ec510608d740b1060a0e8537 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Sun, 4 May 2025 11:19:09 +0300 Subject: [PATCH 11/23] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\200\321\201\320\270\321\217.os" | 67 ++----------------- 1 file changed, 6 insertions(+), 61 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 089d802..c693b0b 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -186,11 +186,11 @@ Парсер.Следующий(); Попытка - ПрочитатьОсновную(Парсер); + ПрочитатьЧислоДоРазделителя(Парсер, Основная, "Основная версия"); ПрочитатьРазделитель(Парсер, "."); - ПрочитатьВторостепенную(Парсер); + ПрочитатьЧислоДоРазделителя(Парсер, Второстепенная, "Второстепенная версия"); ПрочитатьРазделитель(Парсер, "."); - ПрочитатьПатч(Парсер); + ПрочитатьЧислоДоРазделителя(Парсер, Патч, "Версия патча"); ПрочитатьХвостовыеМассивы(Парсер); Исключение ОшибкаЧтенияВерсии = ИнформацияОбОшибке().Описание; @@ -198,27 +198,6 @@ КонецПроцедуры -Процедура ПрочитатьОчереднойРазделитель(Знач Парсер, Знач Разделитель) - - ТекущийТокен = Парсер.Следующий(); - Если ТекущийТокен.Тип = Парсер.ТипКонецТекста Тогда - Возврат; - КонецЕсли; - - Если ТекущийТокен.Тип = Парсер.ТипРазделитель Тогда - Если Разделитель = ТекущийТокен.Значение Тогда - СледующийТокен = Парсер.Следующий(); - Если СледующийТокен.Тип = Парсер.ТипКонецТекста Тогда - ВызватьИсключение СтрШаблон("Неожиданный конец строки версии, нет данных после разделителя <%1>", Разделитель); - КонецЕсли; - Возврат; - КонецЕсли; - КонецЕсли; - - ВызватьИсключение СтрШаблон("Ожидается разделитель <%1>, но получен <%2>", Разделитель, ТекущийТокен.Значение); - -КонецПроцедуры - Процедура ПрочитатьРазделитель(Знач Парсер, Знач Разделитель) ТекущийТокен = Парсер.Текущий(); @@ -240,52 +219,18 @@ КонецПроцедуры -Процедура ПрочитатьОсновную(Знач Парсер) - Токен = Парсер.Текущий(); - Если Токен.Тип = Парсер.ТипКонецТекста Тогда - Возврат; - КонецЕсли; - - Если Токен.Тип = Парсер.ТипЧисло Тогда - Основная = Число(Токен.Значение); - ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда - ВызватьИсключение Токен.Значение; - Иначе - ВызватьИсключение СтрШаблон("Основная версия <%1> должна содержать только цифры", Токен.Значение); - КонецЕсли; - - Парсер.Следующий(); -КонецПроцедуры - -Процедура ПрочитатьВторостепенную(Знач Парсер) - Токен = Парсер.Текущий(); - Если Токен.Тип = Парсер.ТипКонецТекста Тогда - Возврат; - КонецЕсли; - - Если Токен.Тип = Парсер.ТипЧисло Тогда - Второстепенная = Число(Токен.Значение); - ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда - ВызватьИсключение Токен.Значение; - Иначе - ВызватьИсключение СтрШаблон("Второстепенная версия <%1> должна содержать только цифры", Токен.Значение); - КонецЕсли; - - Парсер.Следующий(); -КонецПроцедуры - -Процедура ПрочитатьПатч(Знач Парсер) +Процедура ПрочитатьЧислоДоРазделителя(Знач Парсер, Результат, Знач УточнениеИсключения) Токен = Парсер.Текущий(); Если Токен.Тип = Парсер.ТипКонецТекста Тогда Возврат; КонецЕсли; Если Токен.Тип = Парсер.ТипЧисло Тогда - Патч = Число(Токен.Значение); + Результат = Число(Токен.Значение); ИначеЕсли Токен.Тип = Парсер.ТипОшибка Тогда ВызватьИсключение Токен.Значение; Иначе - ВызватьИсключение СтрШаблон("Версия патча <%1> должна содержать только цифры", Токен.Значение); + ВызватьИсключение СтрШаблон("%1 <%2> должна содержать только цифры", УточнениеИсключения, Токен.Значение); КонецЕсли; Парсер.Следующий(); From 10fc0a00be3c7c521f622c43dd379a0e6d5870d1 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Mon, 12 May 2025 18:01:04 +0300 Subject: [PATCH 12/23] =?UTF-8?q?=D0=9A=D1=80=D0=B0=D1=81=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=82=D0=B5=D1=81=D1=82=20=D1=81=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/preReleasesTests.os | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os index e0b9a5d..e63f375 100644 --- a/tests/preReleasesTests.os +++ b/tests/preReleasesTests.os @@ -48,4 +48,29 @@ Ожидаем.Что(Версия.ПреРелиз[2]).Равно("2"); Ожидаем.Что(Версия.МетаданныеСборки[0]).Равно("git-sha"); Ожидаем.Что(Версия.МетаданныеСборки[1]).Равно("deadbeef"); +КонецПроцедуры + +&ПараметризованныйТест +&ИсточникЗначение("1.2.1", "1.2.2") +&ИсточникЗначение("1.2.2", "1.3.0") +&ИсточникЗначение("1.3.0", "2.0.0") +&ИсточникЗначение("2.0.0", "2.0.1") +&ИсточникЗначение("1.0.0-alpha", "1.0.0-alpha.1") +&ИсточникЗначение("1.0.0-alpha.1", "1.0.0-alpha.beta") +&ИсточникЗначение("1.0.0-alpha.beta", "1.0.0-beta") +&ИсточникЗначение("1.0.0-beta", "1.0.0-beta.2") +&ИсточникЗначение("1.0.0-beta.2", "1.0.0-beta.11") +&ИсточникЗначение("1.0.0-beta.11", "1.0.0-rc.1") +&ИсточникЗначение("1.0.0-rc.1", "1.0.0") +Процедура ПроверитьСтаршинствоВерсий(Знач Версия1, Знач Версия2) Экспорт + + // А < Б + Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия2)).Меньше(0); + // Б > A + Ожидаем.Что(Версии.СравнитьВерсии(Версия2, Версия1)).Больше(0); + // Б = Б + Ожидаем.Что(Версии.СравнитьВерсии(Версия2, Версия2)).Равно(0); + // А = A + Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия1)).Равно(0); + КонецПроцедуры \ No newline at end of file From a67827346d868acc31e14bd3095fefcf2738b694 Mon Sep 17 00:00:00 2001 From: EvilBeaver Date: Tue, 13 May 2025 11:21:40 +0300 Subject: [PATCH 13/23] =?UTF-8?q?=D0=A1=D1=80=D0=B0=D0=B2=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B9=20?= =?UTF-8?q?=D1=81=20=D1=83=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\265\321\200\321\201\320\270\321\217.os" | 41 +++++++++++++++---- tests/preReleasesTests.os | 12 +++++- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index c693b0b..18ef93d 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -94,11 +94,6 @@ Возврат 0; КонецЕсли; - Если ПреРелиз.Количество() = 0 - И ВходящаяВерсия.ПреРелиз.Количество() = 0 Тогда - Возврат 0; - КонецЕсли; - Если ПреРелиз.Количество() = 0 И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда Возврат 1; @@ -109,7 +104,7 @@ Возврат -1; КонецЕсли; - Возврат 0; + Возврат СравнитьПререлизы(ВходящаяВерсия.ПреРелиз); КонецФункции @@ -173,6 +168,38 @@ Возврат Сравнить(ВходящаяВерсия) >= 0; КонецФункции +Функция СравнитьПреРелизы(Знач Сравниваемое) + // Поэлементное сравнение + Для Сч = 0 По Макс(ПреРелиз.ВГраница(), Сравниваемое.ВГраница()) Цикл + // Больший набор предрелизных символов имеет больший приоритет, + // чем меньший набор, если сравниваемые идентификаторы равны => + // если компоненты будут равны, побеждает тот, у кого компонентов больше + + Если Сч > ПреРелиз.ВГраница() Тогда + Возврат -1; + ИначеЕсли Сч > Сравниваемое.ВГраница() Тогда + Возврат 1; + КонецЕсли; + + Текущий = ПреРелиз[Сч]; + Входящий = Сравниваемое[Сч]; + + Если Текущий = Входящий Тогда + Продолжить; + КонецЕсли; + + // Численные идентификаторы имеют низший приоритет + Если ТипЗнч(Текущий) <> ТипЗнч(Входящий) Тогда + Возврат ?(ТипЗнч(Текущий) = Тип("Строка"), 1, -1); + КонецЕсли; + + Возврат ?(Текущий > Входящий, 1, -1); + + КонецЦикла; + + Возврат 0; +КонецФункции + Процедура Прочитать(Знач ВерсияСтрокой) Если СтрДлина(ВерсияСтрокой) = 0 Тогда @@ -283,7 +310,7 @@ Токен = Парсер.Текущий(); Если Токен.Тип = Парсер.ТипЧисло Тогда Парсер.Следующий(); - Возврат Токен.Значение; + Возврат Число(Токен.Значение); ИначеЕсли Токен.Тип = Парсер.ТипТекст Тогда Текст = ""; ТекТокен = Парсер.Текущий(); diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os index e63f375..82adbf3 100644 --- a/tests/preReleasesTests.os +++ b/tests/preReleasesTests.os @@ -44,10 +44,11 @@ Версия = Новый Версия("1.1.0-beta-experimental.4.2+git-sha.deadbeef"); Ожидаем.Что(Версия.ПреРелиз[0]).Равно("beta-experimental"); - Ожидаем.Что(Версия.ПреРелиз[1]).Равно("4"); - Ожидаем.Что(Версия.ПреРелиз[2]).Равно("2"); + Ожидаем.Что(Версия.ПреРелиз[1]).Равно(4); + Ожидаем.Что(Версия.ПреРелиз[2]).Равно(2); Ожидаем.Что(Версия.МетаданныеСборки[0]).Равно("git-sha"); Ожидаем.Что(Версия.МетаданныеСборки[1]).Равно("deadbeef"); + КонецПроцедуры &ПараметризованныйТест @@ -73,4 +74,11 @@ // А = A Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия1)).Равно(0); +КонецПроцедуры + +&Тест +Процедура ПроверитьЧтоМетаданныеСборкиНеУчаствуютВСравнении() + Версия1 = Новый Версия("1.0.1+git.12345"); + Версия2 = Новый Версия("1.0.1+sha.00000"); + Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия2)).Равно(0); КонецПроцедуры \ No newline at end of file From 7ba53eba4fd58a7a65fdf4e492c0cab9f3f65831 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 19 May 2025 14:52:31 +1000 Subject: [PATCH 14/23] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20OneUnit=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/testing.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 6d5ed9f..ae3082c 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -10,7 +10,14 @@ jobs: strategy: fail-fast: false matrix: - oscript_version: ['dev', 'lts-dev', 'default'] - uses: autumn-library/workflows/.github/workflows/test.yml@main + include: + - oscript_version: 'default' + test_engiene: '1testrunner' + - oscript_version: 'stable' + test_engiene: '1testrunner' + - oscript_version: 'dev' + test_engiene: 'oneunit' + uses: autumn-library/workflows/.github/workflows/test.yml@oneunit with: - oscript_version: ${{ matrix.oscript_version }} \ No newline at end of file + oscript_version: ${{ matrix.oscript_version }} + test_engine: ${{ matrix.test_engiene }} From 882b3d27b15528eac6b72a6eff6499bb8e2c3e4b Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 19 May 2025 14:55:41 +1000 Subject: [PATCH 15/23] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=D0=A1=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=D0=A2=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2=20->=20&=D0=A2=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\321\200\321\201\320\270\320\270_test.os" | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" index f320f61..b96712d 100644 --- "a/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" +++ "b/tests/\320\222\320\265\321\200\321\201\320\270\320\270_test.os" @@ -5,23 +5,7 @@ Перем юТест; Перем Лог; -Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт - - юТест = Тестирование; - - ИменаТестов = Новый Массив; - - ИменаТестов.Добавить("ТестДолжен_ПроверитьМаксимальная"); - ИменаТестов.Добавить("ТестДолжен_ПроверитьВДиапазоне"); - // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций"); - // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций"); - - ИменаТестов.Добавить("ТестДолженПроверитьСортировкуВерсий"); - - Возврат ИменаТестов; - -КонецФункции - +&Тест Процедура ТестДолжен_ПроверитьМаксимальная() Экспорт ТестовыеСлучаи = Новый Массив; @@ -73,7 +57,7 @@ КонецПроцедуры - +&Тест Процедура ТестДолжен_ПроверитьВДиапазоне() Экспорт ТестовыеСлучаи = Новый Массив; @@ -142,6 +126,7 @@ КонецПроцедуры +&Тест Процедура ТестДолженПроверитьСортировкуВерсий() Экспорт ЭталонСортировкиПоВозрастанию = СтрРазделить("1.0.0 1.3.0 1.4.0 1.5.0 1.9.0 1.20.0", " "); From 03cc1850505d070031ecbe909b7ea386df6da036 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 19 May 2025 08:01:35 +0200 Subject: [PATCH 16/23] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20fluent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\320\222\320\265\321\200\321\201\320\270\320\270.os" | 1 - 1 file changed, 1 deletion(-) diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" index 7015e2c..aca6a2a 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\320\265\321\200\321\201\320\270\320\270.os" @@ -1,5 +1,4 @@ #Использовать logos -#Использовать fluent Перем Лог; From dedad749dfd74a211733561bf68cc3b5f2bde7cc Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 19 May 2025 08:03:31 +0200 Subject: [PATCH 17/23] Create qa.yaml --- .github/workflows/qa.yaml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/qa.yaml diff --git a/.github/workflows/qa.yaml b/.github/workflows/qa.yaml new file mode 100644 index 0000000..2fc3c70 --- /dev/null +++ b/.github/workflows/qa.yaml @@ -0,0 +1,15 @@ +name: Контроль качества + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + sonar: + uses: autumn-library/workflows/.github/workflows/sonar.yml@v1 + with: + github_repository: oscript-library/semver + coveralls: true + secrets: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} From 25d4331709039a54e88a43b2f7341ac30d03173f Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 19 May 2025 08:06:20 +0200 Subject: [PATCH 18/23] Create sonar-project.properties --- sonar-project.properties | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 sonar-project.properties diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..8b6b230 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,6 @@ +sonar.projectKey=semver +sonar.projectName=semver +sonar.sources=./src +sonar.tests=./tests +sonar.sourceEncoding=UTF-8 +sonar.coverageReportPaths=out/genericCoverage.xml From 5dfe79237cd24dae94df8d4f29a737676a75ebff Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 19 May 2025 08:08:06 +0200 Subject: [PATCH 19/23] =?UTF-8?q?=D0=9F=D0=BE=D1=82=D0=B5=D1=80=D1=8F?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/preReleasesTests.os | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os index 82adbf3..8f50b66 100644 --- a/tests/preReleasesTests.os +++ b/tests/preReleasesTests.os @@ -77,8 +77,8 @@ КонецПроцедуры &Тест -Процедура ПроверитьЧтоМетаданныеСборкиНеУчаствуютВСравнении() +Процедура ПроверитьЧтоМетаданныеСборкиНеУчаствуютВСравнении() Экспорт Версия1 = Новый Версия("1.0.1+git.12345"); Версия2 = Новый Версия("1.0.1+sha.00000"); Ожидаем.Что(Версии.СравнитьВерсии(Версия1, Версия2)).Равно(0); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры From 2ae472edf98d6bb37b37b26ef49b9d42b4c213bb Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 19 May 2025 16:42:40 +1000 Subject: [PATCH 20/23] =?UTF-8?q?=D0=97=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20=D0=BE=D1=82=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 1 + 1 file changed, 1 insertion(+) diff --git a/packagedef b/packagedef index 3609b09..436d83c 100644 --- a/packagedef +++ b/packagedef @@ -15,6 +15,7 @@ .ЗависитОт("logos") .ЗависитОт("strings") .РазработкаЗависитОт("1testrunner", "1.9.2") + .РазработкаЗависитОт("coverage", "0.7.0") .ОпределяетМодуль("Версии", "src/core/Модули/Версии.os") .ОпределяетКласс("Версия", "src/core/Классы/Версия.os") .ОпределяетКласс("ДиапазонВерсий", "src/core/Классы/ДиапазонВерсий.os") From d08cb2ec25ad95860e4a316591e7a5635766d916 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Mon, 19 May 2025 08:47:02 +0200 Subject: [PATCH 21/23] Update coverage.os --- tasks/coverage.os | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/tasks/coverage.os b/tasks/coverage.os index f5a6558..fe41290 100644 --- a/tasks/coverage.os +++ b/tasks/coverage.os @@ -1,12 +1,12 @@ -#Использовать coverage #Использовать 1commands #Использовать fs +#Использовать coverage СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; -ФС.ОбеспечитьПустойКаталог(ОбъединитьПути("build", "coverage")); -ПутьКСтат = ОбъединитьПути("build", "coverage", "stat.json"); +ФС.ОбеспечитьПустойКаталог("out"); +ПутьКСтат = "out/stat.json"; Команда = Новый Команда; Команда.УстановитьКоманду("oscript"); @@ -14,7 +14,7 @@ Команда.ДобавитьПараметр("-encoding=utf-8"); КонецЕсли; Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); -Команда.ДобавитьПараметр(ОбъединитьПути("tasks", "test.os")); +Команда.ДобавитьПараметр("tasks/test.os"); // Файла запуска тестов Команда.ПоказыватьВыводНемедленно(Истина); КодВозврата = Команда.Исполнить(); @@ -22,11 +22,10 @@ ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); ПроцессорГенерации.ОтносительныеПути() - .РабочийКаталог(ОбъединитьПути("build", "coverage")) - .КаталогИсходников(ТекущийКаталог()) - .ИмяФайлаСтатистики() - .GenericCoverage() - .Cobertura() - .Сформировать(); + .РабочийКаталог("out") + .ИмяФайлаСтатистики() + .GenericCoverage() + .Cobertura() + .Сформировать(); ЗавершитьРаботу(КодВозврата); From 40dd5f70ee87551e9f84423221847a8685331101 Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 19 May 2025 19:24:46 +1000 Subject: [PATCH 22/23] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BA=D1=80=D0=BE=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/testing.yml | 8 ++++---- tests/preReleasesTests.os | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index ae3082c..0538b2f 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -12,12 +12,12 @@ jobs: matrix: include: - oscript_version: 'default' - test_engiene: '1testrunner' + test_engine: '1testrunner' - oscript_version: 'stable' - test_engiene: '1testrunner' + test_engine: '1testrunner' - oscript_version: 'dev' - test_engiene: 'oneunit' + test_engine: 'oneunit' uses: autumn-library/workflows/.github/workflows/test.yml@oneunit with: oscript_version: ${{ matrix.oscript_version }} - test_engine: ${{ matrix.test_engiene }} + test_engine: ${{ matrix.test_engine }} diff --git a/tests/preReleasesTests.os b/tests/preReleasesTests.os index 8f50b66..fa28f00 100644 --- a/tests/preReleasesTests.os +++ b/tests/preReleasesTests.os @@ -63,6 +63,7 @@ &ИсточникЗначение("1.0.0-beta.2", "1.0.0-beta.11") &ИсточникЗначение("1.0.0-beta.11", "1.0.0-rc.1") &ИсточникЗначение("1.0.0-rc.1", "1.0.0") +&ИсточникЗначение("1.0.0-alpha", "1.0.0") Процедура ПроверитьСтаршинствоВерсий(Знач Версия1, Знач Версия2) Экспорт // А < Б From 6dc7e619056ae3e0d56c00e30a5b68adc8903bbb Mon Sep 17 00:00:00 2001 From: sfaqer Date: Mon, 19 May 2025 19:30:46 +1000 Subject: [PATCH 23/23] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D0=B8=D0=B7=D0=BD=D0=BE=D0=B9=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20=D0=B8=20=D0=BE=D0=B4=D0=BD=D0=BE?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20RC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\320\222\320\265\321\200\321\201\320\270\321\217.os" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" index 18ef93d..3318cac 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\321\217.os" @@ -95,7 +95,7 @@ КонецЕсли; Если ПреРелиз.Количество() = 0 - И ВходящаяВерсия.ПреРелиз.Количество() > 1 Тогда + И ВходящаяВерсия.ПреРелиз.Количество() > 0 Тогда Возврат 1; КонецЕсли;