Skip to content

Commit

Permalink
Merge pull request #9 from bia-technologies/feature/gh7
Browse files Browse the repository at this point in the history
Feature/gh7
  • Loading branch information
theshadowco authored Oct 5, 2020
2 parents 7d053d5 + 6b3b7e1 commit 79debf4
Show file tree
Hide file tree
Showing 8 changed files with 493 additions and 44 deletions.
19 changes: 12 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,16 +75,20 @@ precommit4onec может читать настройки своей работ

```JSON
{
"GLOBAL": { // необязательная секция
"ВерсияПлатформы": "8.3.10.2309", // используемая версия платформы например для разбора на исходники
"version": "2.0" // версия конфигурационного файла (необязательно)
},
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false, // Признак, выполнения проверок из репозитория
"КаталогЛокальныхСценариев": "", // Относительный путь к каталогу локальных проверок
"ГлобальныеСценарии": [...], // Список проверок, которые будут выполнятся
"ОтключенныеСценарии": [...], // Список проверок, которые не будут выполнятся (имеет больший приоритет относительно ГлобальныеСценарии)
"НастройкиСценариев": { // Настройки выполняемых проверок
"ИспользоватьСценарииРепозитория": false, // Признак, выполнения проверок из репозитория
"КаталогЛокальныхСценариев": "", // Относительный путь к каталогу локальных проверок
"ГлобальныеСценарии": [...], // Список проверок, которые будут выполнятся
"ОтключенныеСценарии": [...], // Список проверок, которые не будут выполнятся (имеет больший приоритет относительно ГлобальныеСценарии)
"НастройкиСценариев": { // Настройки выполняемых проверок
...
},
"Проекты":{ // Настройки проектов (подкаталогов репозитория). Настройки проектов полностью переопределяют настройки и имеют такую же структуру
"configuration\\": { // Имя проекта (подкаталога)
"Проекты":{ // Настройки проектов (подкаталогов репозитория). Настройки проектов полностью переопределяют настройки и имеют такую же структуру
"configuration\\": { // Имя проекта (подкаталога)
"ИспользоватьСценарииРепозитория": false,
"ГлобальныеСценарии": []
}
Expand All @@ -93,6 +97,7 @@ precommit4onec может читать настройки своей работ
}
```


## Расширение функциональности

Для создания нового сценария обработки файлов необходимо воспользоваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта.
Expand Down
1 change: 1 addition & 0 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
.ЗависитОт("gitrunner", "1.6.0")
.ЗависитОт("v8runner", "1.3.0")
.ЗависитОт("v8unpack", "1.0.4")
.ЗависитОт("semver", "0.5.2")
.ВключитьФайл("src")
.ВключитьФайл("v8config.json")
.ВключитьФайл("LICENSE")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРепозитория",
"Каталог анализируемого репозитория");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-source-dir",
"Каталог расположения исходных файлов относительно корня репозитория. По умолчанию <src>");
"Каталог расположения исходных файлов относительно корня репозитория.
| Если сценариев несколько, указываются в кавычках через , . По умолчанию <src>");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-rules",
"Перечень правил для применения. Если сценариев несколько, указываются в кавычках через ,");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-cfg-file",
Expand Down Expand Up @@ -58,29 +59,45 @@
Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда

КаталогИсходныхФайлов = "src";

КонецЕсли;

ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда
Иначе

КаталогиИсходныхФайлов = СтрЗаменить(ПараметрыКоманды["-source-dir"], " ", "");
МассивКаталоговИсходныхФайлов = СтрРазделить(КаталогиИсходныхФайлов, ",", Ложь);

Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов);

КонецЕсли;

ОбрабатываемыеФайлы = Новый Массив();

КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;
Для Каждого КаталогИсходныхФайлов Из МассивКаталоговИсходныхФайлов Цикл

ТекущийКаталогИсходныхФайлов = ОбъединитьПути(КаталогРепозитория, КаталогИсходныхФайлов);
ФайлТекущийКаталогИсходныхФайлов = Новый Файл(ТекущийКаталогИсходныхФайлов);
ТекущийКаталогИсходныхФайлов = ФайлТекущийКаталогИсходныхФайлов.ПолноеИмя;
Если НЕ ФайлТекущийКаталогИсходныхФайлов.Существует() Тогда

Лог.Ошибка("Каталога <%1> не существует", ТекущийКаталогИсходныхФайлов);

КонецЕсли;

КаталогРепозитория = ФайлКаталогРепозитория.ПолноеИмя;

ОбрабатываемыеФайлыКаталога = НайтиФайлы(ТекущийКаталогИсходныхФайлов, "*", Истина);

Для Каждого ОбрабатываемыйФайлКаталога Из ОбрабатываемыеФайлыКаталога Цикл

ОбрабатываемыеФайлы.Добавить(ОбрабатываемыйФайлКаталога);

КонецЦикла;

КонецЦикла;

ИменаЗагружаемыхСценариев = Неопределено;
Если ЗначениеЗаполнено(ПараметрыКоманды["-rules"]) Тогда
ПараметрИменаСценариев = СтрЗаменить(ПараметрыКоманды["-rules"], " ", "");
ИменаЗагружаемыхСценариев = СтрРазделить(ПараметрИменаСценариев, ",", Ложь);
КонецЕсли;

ОбрабатываемыеФайлы = НайтиФайлы(ТекущийКаталогИсходныхФайлов, "*", Истина);


Ит = 0;

УправлениеНастройками = МенеджерНастроек.НастройкиРепозитория(АдресПоискаКонфигурационногоФайла);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,18 +77,22 @@
ТЧ.Колонки.Добавить("Значение");
ТЧ.Колонки.Добавить("Количество");

СтрокиФайла = Новый Соответствие;
Для Каждого ГруппаИндексов Из ГруппыИндексов Цикл

СтрокаТЧ = ТЧ.ДОбавить();
СтрокаТЧ.Значение = Число(ГруппаИндексов.Группы[1].Значение);
СтрокаТЧ.Количество = 1;

СтрокиФайла.Вставить(СтрокаТЧ.Значение, ГруппаИндексов.Группы[1].Индекс);
Значение = Число(ГруппаИндексов.Группы[1].Значение);

СтрокаТЧ = ТЧ.Найти(Значение, "Значение");
Если СтрокаТЧ = Неопределено Тогда
СтрокаТЧ = ТЧ.Добавить();
СтрокаТЧ.Значение = Значение;
СтрокаТЧ.Количество = 1;
Иначе
СтрокаТЧ.Количество = СтрокаТЧ.Количество + 1;
КонецЕсли;
КонецЦикла;

// ТЧ.Свернуть("Значение", "Количество"); баг в движке oscript > 1.0.21 TODO: Вернуть свернуть

ТЧ.Свернуть("Значение", "Количество");
Если ТЧ.Количество() = ГруппыИндексов.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Expand All @@ -97,7 +101,7 @@
ПоследнийНомер = ТЧ[0].Значение;
ТЧ.Сортировать("Количество УБЫВ");
Для каждого СтрокаТЧ Из ТЧ Цикл

Если СтрокаТЧ.Количество = 1 Тогда

Прервать;
Expand All @@ -123,6 +127,6 @@

ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);

Возврат ИСТИНА;
Возврат Истина;

КонецФункции
КонецФункции
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <ИмяСценария>
//
///////////////////////////////////////////////////////////////////////////////

// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт

Возврат "ОбработкаЮнитТестов";

КонецФункции // ИмяСценария()

// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
// * ИзмененныеКаталоги - Массив - Каталоги / файлы которые необходимо добавить в индекс
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт

Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());

// анализ файла без изменения его содержимого
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл)
И СтрНайти(АнализируемыйФайл.ПолноеИмя, "/tests/") Тогда

Лог.Информация("Обработка файла '%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);
Сообщить("Обновлен файл " + Файл.ПолноеИмя);

Возврат Истина;
КонецЕсли;

КонецЕсли;

Возврат Ложь;

КонецФункции
Loading

0 comments on commit 79debf4

Please sign in to comment.