From 19a129d93fea76eda0e578c6838eeb752277d6de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=97=D0=B0=D0=B7=D1=83=D0=BB=D0=BE=D0=B2=20=D0=90=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87=20=28=D0=97?= =?UTF-8?q?=D0=9A-0001393=29?= Date: Wed, 17 Apr 2024 20:16:58 +0300 Subject: [PATCH] =?UTF-8?q?ORAIS-1430:=20=D0=9B=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D1=81=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8E=20=D0=9F=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B9=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ЗапретИспользованияПерейти.os | 53 +++++++++++++------ .../ЗапретИспользованияПерейти/v8config.json | 52 ++++++++++++++++++ .../МодульСПерейти.bsl | 9 ++++ .../МодульСоСтрокой.bsl | 4 ++ .../МодульСоСтрокой2.bsl | 8 +++ tests/ТестПроверкаСценариевОбработки.os | 33 ++++++++++++ 6 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 tests/fixtures/ЗапретИспользованияПерейти/v8config.json create mode 100644 tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl create mode 100644 tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl create mode 100644 tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl diff --git a/src/СценарииОбработки/ЗапретИспользованияПерейти.os b/src/СценарииОбработки/ЗапретИспользованияПерейти.os index 82802d6..b10e211 100644 --- a/src/СценарииОбработки/ЗапретИспользованияПерейти.os +++ b/src/СценарииОбработки/ЗапретИспользованияПерейти.os @@ -54,25 +54,48 @@ Процедура ПроверитьНаОтсутствиеПерейти(ПутьКФайлуМодуля) ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля); - - ТекстОшибки = ""; - ШаблонПоиска = Новый РегулярноеВыражение("[\s;]+?[^|]Перейти\s+?~[a-zA-ZА-ЯЁа-яё0-9_]+"); - ШаблонПоиска.Многострочный = Истина; - ШаблонПоиска.ИгнорироватьРегистр = Истина; - Если НЕ ПустаяСтрока(ТекстМодуля) Тогда + + ТекстОшибки = ""; + ШаблонПоиска = Новый РегулярноеВыражение("[\s;]+?[^|](Перейти\s+?~[a-zA-ZА-ЯЁа-яё0-9_]+)"); + ШаблонПоиска.Многострочный = Истина; + ШаблонПоиска.ИгнорироватьРегистр = Истина; Совпадения = ШаблонПоиска.НайтиСовпадения(ТекстМодуля); - Если Совпадения.Количество() Тогда - - ТекстОшибки = СтрШаблон( - "В файле '%1' обнаружено использование Перейти (%2)", - ПутьКФайлуМодуля, - Совпадения.Количество()); - Лог.Ошибка(ТекстОшибки); - ВызватьИсключение ТекстОшибки; - + Если Совпадения.Количество() = 0 Тогда + Возврат; КонецЕсли; + + Совпадение = Совпадения[0]; + Если Совпадение.Группы.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + БлокПерейти = Совпадение.Группы[1].Значение; + ПозицияБлока = СтрНайти(Совпадение.Значение, БлокПерейти); + + КавычкиОткрыты = Ложь; + ПозицияКавычек = 0; + Пока ПозицияКавычек < ПозицияБлока Цикл + ПозицияКавычек = СтрНайти(Совпадение.Значение, """", НаправлениеПоиска.СНачала, ПозицияКавычек + 1); + Если ПозицияКавычек = 0 ИЛИ ПозицияКавычек > ПозицияБлока Тогда + Прервать; + КонецЕсли; + + КавычкиОткрыты = НЕ КавычкиОткрыты; + КонецЦикла; + + Если КавычкиОткрыты Тогда + // Блок Перейти находится внутри строкового значения и не является выражением языка. + Возврат; + КонецЕсли; + + ТекстОшибки = СтрШаблон( + "В файле '%1' обнаружено использование Перейти (%2)", + ПутьКФайлуМодуля, + Совпадения.Количество()); + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; КонецЕсли; diff --git a/tests/fixtures/ЗапретИспользованияПерейти/v8config.json b/tests/fixtures/ЗапретИспользованияПерейти/v8config.json new file mode 100644 index 0000000..d370a14 --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/v8config.json @@ -0,0 +1,52 @@ +{ + "Precommt4onecСценарии": { + "ИспользоватьСценарииРепозитория": false, + "КаталогЛокальныхСценариев": "", + "ГлобальныеСценарии": [ + "ВставкаКопирайтов.os", + "ДобавлениеПробеловПередКлючевымиСловами.os", + "ЗапретИспользованияПерейти.os", + "ИсправлениеНеКаноническогоНаписания.os", + "КорректировкаXMLФорм.os", + "ОбработкаЮнитТестов.os", + "ОтключениеПолнотекстовогоПоиска.os", + "ОтключениеРазрешенияИзменятьФорму.os", + "ПроверкаДублейПроцедурИФункций.os", + "ПроверкаКорректностиИнструкцийПрепроцессора.os", + "ПроверкаКорректностиОбластей.os", + "ПроверкаНецензурныхСлов.os", + "РазборОбычныхФормНаИсходники.os", + "РазборОтчетовОбработокРасширений.os", + "СинхронизацияОбъектовМетаданныхИФайлов.os", + "СортировкаСостава.os", + "УдалениеДублейМетаданных.os", + "УдалениеЛишнихКонцевыхПробелов.os", + "УдалениеЛишнихПустыхСтрок.os" + ], + "ОтключенныеСценарии": [], + "Проекты": { + "configurator\\": "configurator\\", + "EDT\\Configuration\\src\\": "EDT\\Configuration\\src\\", + "no_parent_configuration\\": "no_parent_configuration\\" + }, + "НастройкиСценариев": { + "ВставкаКопирайтов": { + "ИгнорироватьМодулиОбъектовПоставки": true, + "ПутьКФайлуКопирайта": "COPYRIGHT", + "ИсключаемыеТэги": [ + "// IMPORT" + ] + }, + "ОтключениеПолнотекстовогоПоиска": { + "МетаданныеДляИсключения": {} + }, + "ПроверкаНецензурныхСлов": { + "ФайлСНецензурнымиСловами": "НецензурныеСлова.txt" + }, + "РазборОтчетовОбработокРасширений": { + "ИспользоватьНастройкиПоУмолчанию": true, + "ВерсияПлатформы": "" + } + } + } +} \ No newline at end of file diff --git a/tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl b/tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl new file mode 100644 index 0000000..6ddd15e --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/МодульСПерейти.bsl @@ -0,0 +1,9 @@ + +Процедура ПропуститьБлокВнутриКонструкцииПерейти() + Значение = Неопределено; + Перейти ~Метка; + + Значение = "Не будет установлено"; +~Метка: + Сообщить(Значение); +КонецПроцедуры diff --git a/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl new file mode 100644 index 0000000..7b531c8 --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой.bsl @@ -0,0 +1,4 @@ + +Функция РекомендацияПоИспользованию() + Возврат СтрШаблон("Мы не рекомендуем использовать: %1", "Перейти ~Метка"); +КонецФункции diff --git a/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl new file mode 100644 index 0000000..5f25724 --- /dev/null +++ b/tests/fixtures/ЗапретИспользованияПерейти/МодульСоСтрокой2.bsl @@ -0,0 +1,8 @@ + +Функция ПримерПлохогоКода() + Возврат "Значение = Неопределено; + | Перейти ~Метка; + | Значение = Ложь; + |~Метка: + | Значение = Истина"; +КонецФункции diff --git a/tests/ТестПроверкаСценариевОбработки.os b/tests/ТестПроверкаСценариевОбработки.os index 94c20d2..2fa5818 100644 --- a/tests/ТестПроверкаСценариевОбработки.os +++ b/tests/ТестПроверкаСценариевОбработки.os @@ -38,6 +38,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени"); ВсеТесты.Добавить("ТестДолжен_ПроверитьИзменениеТегаКастомизацииФормы"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийВставкиКопирайтовНеОбновляетКопирайтВФайлахПоставки"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку"); Возврат ВсеТесты; @@ -552,6 +553,38 @@ #КонецОбласти +#Область ЗапретИспользованияПерейти + +Процедура ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку() Экспорт + НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + ОбъектСценария = ПолучитьСценарий("ЗапретИспользованияПерейти.os"); + + ВременныйКаталог = ПолучитьИмяВременногоФайла(); + Фикстура = Фикстура("ЗапретИспользованияПерейти"); + СоздатьКаталог(ВременныйКаталог); + СкопироватьКаталог(Фикстура, ВременныйКаталог); + + Настройки = ПолучитьДополнительныеНастройки(ВременныйКаталог); + МассивФайлов = НайтиФайлы(ВременныйКаталог, "*.bsl", Истина); + Для Каждого Файл Из МассивФайлов Цикл + ОжидаемыйРезультат = СтрНайти(Файл.Имя, "Перейти") = 0; + Попытка + Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки); + Исключение + Результат = Ложь; + КонецПопытки; + Ожидаем.Что(Результат, "Ошибка проверки запрета использования Перейти в файле " + Файл.Имя).Равно(ОжидаемыйРезультат); + КонецЦикла; + + МенеджерВременныхФайлов.УдалитьФайл(ВременныйКаталог); + + ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера; + Настройки.Лог.Отладка("Тестирование запрета использования Перейти выполнено за %1 мс.", ВремяВыполнения); +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область Служебные