1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-23 02:06:12 +02:00
OpenIntegrations/.github/workflows/os/internal/Modules/МетодыПримеровКода.os

253 lines
12 KiB
Plaintext

#Использовать osparser
#использовать "../../../../../src/ru/OInt/tools/"
Перем МодульТестов;
Перем Парсер;
Перем ОбластьТестов;
Перем КаталогСохранения;
Перем КаталогЗаписиЗначений;
Перем ТекущаяСтруктураЗначений;
Процедура ПолучитьПримерыКодаДокументации(Знач ПутьТестов, Знач ПутьПримеров, Знач ПутьЗначений, ИмяОбласти) Экспорт
ОбластьТестов = ИмяОбласти;
КаталогСохранения = ПутьПримеров;
КаталогЗаписиЗначений = ПутьЗначений;
Парсер = Новый ПарсерВстроенногоЯзыка;
МодульТестов = Новый ТекстовыйДокумент();
МодульТестов.Прочитать(ПутьТестов);
Начало = 0;
Окончание = 0;
ПолучитьГраницыОбластиТестов(Начало, Окончание);
ДокументАтомарныхТестов = Новый ТекстовыйДокумент();
Для Н = Начало По Окончание Цикл
ДокументАтомарныхТестов.ДобавитьСтроку(МодульТестов.ПолучитьСтроку(Н));
КонецЦикла;
МодульТестов = ДокументАтомарныхТестов;
РазобратьТесты();
КонецПроцедуры
Процедура ПолучитьГраницыОбластиТестов(Начало, Окончание)
ТекстМодуля = МодульТестов.ПолучитьТекст();
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
ВложенныеОбласти = 0;
Для Каждого Объявление Из СтруктураМодуля.Объявления Цикл
Если Строка(Объявление.Тип) = "ИнструкцияПрепроцессораОбласть" Тогда
Если Объявление.Имя = ОбластьТестов Тогда
Начало = Объявление.Начало.НомерСтроки;
КонецЕсли;
Если ЗначениеЗаполнено(Начало) Тогда
ВложенныеОбласти = ВложенныеОбласти + 1;
КонецЕсли;
КонецЕсли;
Если Строка(Объявление.Тип) = "ИнструкцияПрепроцессораКонецОбласти" И ЗначениеЗаполнено(Начало) Тогда
Если ВложенныеОбласти = 0 Тогда
Окончание = Объявление.Начало.НомерСтроки;
Прервать;
Иначе
ВложенныеОбласти = ВложенныеОбласти - 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура РазобратьТесты()
ТекстМодуля = МодульТестов.ПолучитьТекст();
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
Для Каждого Объявление Из СтруктураМодуля.Объявления Цикл
Если Строка(Объявление.Тип) = "ОбъявлениеМетода" Тогда
РазобратьМетод(Объявление.Начало.НомерСтроки, Объявление.Сигнатура.Имя);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура РазобратьМетод(НомерСтроки, Имя)
РазбитоеИмя = СтрРазделить(Имя, "_", Ложь);
Если РазбитоеИмя.Количество() <> 2 Тогда
Сообщить("Метод " + Имя + " был найден но не обработан", СтатусСообщения.ОченьВажное);
Возврат;
КонецЕсли;
ТекстТекущейСтроки = МодульТестов.ПолучитьСтроку(НомерСтроки + 1);
ТекстПримера = "";
ТекущаяСтруктураЗначений = Новый Соответствие();
ПрошлаяПустая = Ложь;
Пока СтрНайти(ТекстТекущейСтроки, "END") = 0
И СтрНайти(ТекстТекущейСтроки, "КонецПроцедуры") = 0
И СтрНайти(ТекстТекущейСтроки, "EndProcedure") = 0 Цикл
ТекущаяПустая = Ложь;
ЭтоСкип = СтрНайти(ТекстТекущейСтроки, "SKIP") <> 0;
ЭтоЛог = СтрНайти(ТекстТекущейСтроки, "ЗаписатьЛог") <> 0 Или СтрНайти(ТекстТекущейСтроки, "WriteLog") <> 0;
Если Не ЗначениеЗаполнено(СокрЛП(ТекстТекущейСтроки))
Или ЭтоСкип Или ЭтоЛог Тогда
ТекущаяПустая = Истина;
КонецЕсли;
Если Не ЭтоСкип И Не ЭтоЛог Тогда
Если Не (ТекущаяПустая И ПрошлаяПустая) Тогда
ТекстПримера = ТекстПримера + Символы.ПС + ПреобразоватьТекст(ТекстТекущейСтроки);
КонецЕсли;
КонецЕсли;
НомерСтроки = НомерСтроки + 1;
ТекстТекущейСтроки = МодульТестов.ПолучитьСтроку(НомерСтроки);
ПрошлаяПустая = ТекущаяПустая;
КонецЦикла;
Каталог = КаталогСохранения + РазбитоеИмя[0];
ОбъектКаталога = Новый Файл(Каталог);
Если Не ОбъектКаталога.Существует() Тогда
СоздатьКаталог(Каталог);
КонецЕсли;
ТекстПримера = СтрЗаменить(ТекстПримера, Символы.Таб, " ");
ТекстПримера = " " + СокрЛП(ТекстПримера);
ТекстПримера = СтрЗаменить(ТекстПримера, " " + Символы.ПС + " " + Символы.ПС, Символы.ПС);
ТекстПримера = СтрЗаменить(ТекстПримера, Символы.ПС + " " + Символы.ПС, Символы.ПС);
ПутьПримера = Каталог + "/" + РазбитоеИмя[1] + ".txt";
ФайлПримера = Новый ТекстовыйДокумент();
ФайлПримера.УстановитьТекст(ТекстПримера);
ФайлПримера.Записать(ПутьПримера);
Если ЗначениеЗаполнено(ТекущаяСтруктураЗначений) Тогда
КаталогЗначений = КаталогЗаписиЗначений + РазбитоеИмя[0];
ОбъектКаталога = Новый Файл(КаталогЗначений);
Если Не ОбъектКаталога.Существует() Тогда
СоздатьКаталог(КаталогЗначений);
КонецЕсли;
ПутьДанных = КаталогЗначений + "/" + РазбитоеИмя[1] + ".json";
ФайлДанных = Новый Файл(ПутьДанных);
Если ФайлДанных.Существует() Тогда
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьФайл(ПутьДанных, "UTF-8");
СтараяСтруктураЗначений = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Для Каждого ЭлементСтруктуры Из СтараяСтруктураЗначений Цикл
ТекущаяСтруктураЗначений.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(ПутьДанных, , , Новый ПараметрыЗаписиJSON());
ЗаписатьJSON(ЗаписьJSON, ТекущаяСтруктураЗначений);
ЗаписьJSON.Закрыть();
КонецЕсли;
КонецПроцедуры
Функция ПреобразоватьТекст(Текст)
ЕстьRU = СтрНайти(Текст, "ПараметрыФункции") <> 0;
ЕстьEN = СтрНайти(Текст, "FunctionParameters") <> 0;
Если ЕстьRU Или ЕстьEN Тогда
Если ЕстьEN Тогда
А = 1;
КонецЕсли;
РазбитоеЗначение = СтрРазделить(Текст, "=", Ложь);
ИмяПараметра = ОпределитьИмяПараметра(Текст, ?(ЕстьRU, "ПараметрыФункции", "FunctionParameters"));
Попытка
Значение = OPI_ПолучениеДанныхТестов.ПолучитьПараметр(ИмяПараметра);
Исключение
ОО = ОписаниеОшибки();
Возврат Текст;
КонецПопытки;
ЗакрытьСекретныеДанные(Значение, ИмяПараметра);
Если РазбитоеЗначение.Количество() = 2 Тогда
ТекущаяСтруктураЗначений.Вставить(СокрЛП(РазбитоеЗначение[0]), Значение);
КонецЕсли;
ОпределениеПараметра = "ПараметрыФункции[""" + ИмяПараметра + """]";
Текст = СтрЗаменить(Текст, ОпределениеПараметра, """" + Строка(Значение) + """");
ОпределениеПараметра = "FunctionParameters[""" + ИмяПараметра + """]";
Текст = СтрЗаменить(Текст, ОпределениеПараметра, """" + Строка(Значение) + """");
КонецЕсли;
Возврат Текст;
КонецФункции
Функция ОпределитьИмяПараметра(Текст, Коллекция)
НачалоПараметра = СтрНайти(Текст, Коллекция + "[""") + СтрДлина(Коллекция) + 2;
КонецПараметра = СтрНайти(Текст, """]");
Имя = Сред(Текст, НачалоПараметра, КонецПараметра - НачалоПараметра);
Возврат Имя;
КонецФункции
Процедура ЗакрытьСекретныеДанные(Значение, ИмяПараметра)
СоответствиеПризнаковСекретов = Новый Соответствие();
СоответствиеПризнаковСекретов.Вставить("Secret" , 2);
СоответствиеПризнаковСекретов.Вставить("Token" , 2);
СоответствиеПризнаковСекретов.Вставить("Key" , 2);
СоответствиеПризнаковСекретов.Вставить("Refresh" , 2);
СоответствиеПризнаковСекретов.Вставить("Bitrix24_URL", 1.3);
Для Каждого Признак Из СоответствиеПризнаковСекретов Цикл
Если СтрНайти(нРег(ИмяПараметра), нРег(Признак.Ключ)) <> 0 Тогда
Значение = Лев(Значение, Цел(СтрДлина(Значение) / Признак.Значение)) + "...";
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры