1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2024-11-28 08:48:45 +02:00

Добавлен сценарий обработки тестов.

Скорректирован обход каталогов анализируемых фалов.
This commit is contained in:
Суфьянов Артем Ильдарович 2020-09-28 10:56:05 +03:00
parent 311d28380a
commit ad381e42d9
2 changed files with 180 additions and 14 deletions

View File

@ -19,7 +19,8 @@
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория",
"Каталог анализируемого репозитория");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir",
"Каталог расположения исходных файлов относительно корня репозитория. По умолчанию <src>");
"Каталог расположения исходных файлов относительно корня репозитория.
| Если сценариев несколько, указываются в кавычках через , . По умолчанию <src>");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-rules",
"Перечень правил для применения. Если сценариев несколько, указываются в кавычках через ,");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-cfg-file",
@ -58,29 +59,45 @@
Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
КаталогИсходныхФайлов = "src";
Иначе
КаталогиИсходныхФайлов = СтрЗаменить(ПараметрыКоманды["-source-dir"], " ", "");
МассивКаталоговИсходныхФайлов = СтрРазделить(КаталогиИсходныхФайлов, ",", Ложь);
КонецЕсли;
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
ОбрабатываемыеФайлы = Новый Массив();
Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов);
Для Каждого КаталогИсходныхФайлов Из МассивКаталоговИсходныхФайлов Цикл
ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов);
КонецЕсли;
КонецЕсли;
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, "*", Истина);
Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл
ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайлКаталога);
КонецЦикла;
КонецЦикла;
КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
ИменаЗагружаемыхСценариев = Неопределено;
Если ЗначениеЗаполнено(ПараметрыКоманды["-rules"]) Тогда
ПараметрИменаСценариев = СтрЗаменить(ПараметрыКоманды["-rules"], " ", "");
ИменаЗагружаемыхСценариев = СтрРазделить(ПараметрИменаСценариев, ",", Ложь);
КонецЕсли;
ОбрабатываемыеФайлы = НайтиФайлы(ТекущийКаталогИсходныхФайлов, "*", Истина);
Ит = 0;
УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(АдресПоискаКонфигурационногоФайла);

View File

@ -0,0 +1,149 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <ИмяСценария>
//
///////////////////////////////////////////////////////////////////////////////
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "Обработка Юнит Тестов";
КонецФункции // ИмяСценария()
// ПолучитьСтандартныеНастройкиСценария
// Возвращает структуру настроек сценария
//
// Возвращаемое значение:
// Структура - Структура с настройками сценария
// * ИмяСценария - Строка - Имя, с которым сохранятся настройки
// * Настройка - Соответствие - настройки
//
Функция ПолучитьСтандартныеНастройкиСценария() Экспорт
ВызватьИсключение "Настройки отсутствуют";
НастройкиСценария = Новый Соответствие;
НастройкиСценария.Вставить("ИспользоватьПоУмолчанию", Истина);
НастройкиСценария.Вставить("Версия", "");
НастройкиСценария.Вставить("КоличествоПопыток", 5);
НастройкиСценария.Вставить("МассивПараметров", Новый Массив);
Возврат Новый Структура("ИмяСценария, Настройка", ИмяСценария(), НастройкиСценария);
КонецФункции
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
// * ИзмененныеКаталоги - Массив - Каталоги / файлы которые необходимо добавить в индекс
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());
// анализ файла без изменения его содержимого
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл)
И СтрНайти(КаталогИсходныхФайлов, "tests/src") Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ОбработкаФайла(АнализируемыйФайл);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
Процедура ОбработкаФайла(ИмяФайла)
РегулярноеВыражениеМетоды = Новый РегулярноеВыражение("\/\/\s*?\@unit-test\:.*?\nПроцедура\s+?(.+)\s*?\(.*\s*Экспорт");
РегулярноеВыражениеМетоды.ИгнорироватьРегистр = Истина;
РегулярноеВыражениеМетоды.Многострочный = Истина;
РегулярноеВыражениеAPI = Новый РегулярноеВыражение("(#Область ТестыAPI\s*?[.\w\W]+?#КонецОбласти\s*?$)");
РегулярноеВыражениеAPI.ИгнорироватьРегистр = Истина;
РегулярноеВыражениеAPI.Многострочный = Истина;
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
Возврат;
КонецЕсли;
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя, КодировкаТекста.UTF8NoBOM);
Текст = ТекстовыйДокумент.ПолучитьТекст();
Совпадения = РегулярноеВыражениеМетоды.НайтиСовпадения(Текст);
ТекстМетода = "";
Если Совпадения.Количество() Тогда
Для Каждого Совпадение Из Совпадения Цикл
ТекстМетода = ТекстМетода + Символы.ПС
+ " ИсполняемыеСценарии.Добавить(""" + Совпадение.Группы[1].Значение + """);";
КонецЦикла;
КонецЕсли;
Если Не ПустаяСтрока(ТекстМетода) Тогда
ТекстМетода = "#Область ТестыAPI
|
|// ИсполняемыеСценарии
|// Сервисный метод для получения списка тестовых методов
|// Параметры:
|// ДополнительныеПараметры - Структура - Дополнительные параметры, используемые при формировании списка тестов
|// Возвращаемое значение:
|// Массив - Имена методов тестов
|Функция ИсполняемыеСценарии(ДополнительныеПараметры = Неопределено) Экспорт
|
| ИсполняемыеСценарии = Новый Массив; " + ТекстМетода + "
|
| Возврат ИсполняемыеСценарии;
|
|КонецФункции
|
|#КонецОбласти";
Совпадения = РегулярноеВыражениеAPI.НайтиСовпадения(Текст);
НовыйТекстМодуля = Текст;
Если Совпадения.Количество() Тогда
НовыйТекстМодуля = РегулярноеВыражениеAPI.Заменить(Текст, ТекстМетода);
Иначе
Поз = СтрНайти(Текст, "#Область Тесты");
Если Поз > 0 Тогда
НовыйТекстМодуля = Лев(Текст, Поз - 1) + ТекстМетода + Символы.ПС + Символы.ПС + Сред(Текст, Поз);
Иначе
НовыйТекстМодуля = ТекстМетода + Символы.ПС + Символы.ПС + Текст;
КонецЕсли;
КонецЕсли;
Если НовыйТекстМодуля <> Текст Тогда
ТекстовыйДокумент.УстановитьТекст(НовыйТекстМодуля);
ТекстовыйДокумент.Записать(Файл.ПолноеИмя, КодировкаТекста.UTF8NoBOM);
Сообщить("Обновлен файл " + Файл.ПолноеИмя);
КонецЕсли;
КонецЕсли;
КонецПроцедуры