1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-16 11:38:11 +02:00
OpenIntegrations/.github/workflows/os/cli_parse.os

493 lines
27 KiB
Plaintext
Raw Normal View History

#Использовать osparser
Перем КаталогБиблиотеки;
Перем ФайлСоставаОПИ;
Перем МодульСоставаОПИ;
2024-04-07 11:10:56 +02:00
Перем СоответствиеМодулейКоманд;
Перем ТекущийМодуль;
2024-04-07 11:10:56 +02:00
Перем ТаблицаОписанийПараметров;
Процедура ПриСозданииОбъекта()
2024-04-07 11:10:56 +02:00
МодульСоставаОПИ = Новый ТекстовыйДокумент();
2024-03-24 01:05:51 +02:00
КаталогБиблиотеки = "./OInt/core/Modules";
ФайлСоставаОПИ = "./cli/data/Modules/СоставБиблиотеки.os";
2024-04-07 11:10:56 +02:00
СоответствиеМодулейКоманд = Новый Соответствие();
СоответствиеМодулейКоманд.Вставить("OPI_Telegram" , "telegram");
СоответствиеМодулейКоманд.Вставить("OPI_VK" , "vk");
СоответствиеМодулейКоманд.Вставить("OPI_Viber" , "viber");
СоответствиеМодулейКоманд.Вставить("OPI_Twitter" , "twitter");
СоответствиеМодулейКоманд.Вставить("OPI_Notion" , "notion");
СоответствиеМодулейКоманд.Вставить("OPI_YandexID" , "yandex");
СоответствиеМодулейКоманд.Вставить("OPI_YandexDisk" , "yadisk");
СоответствиеМодулейКоманд.Вставить("OPI_GoogleWorkspace", "google");
СоответствиеМодулейКоманд.Вставить("OPI_GoogleCalendar" , "gcalendar");
СоответствиеМодулейКоманд.Вставить("OPI_GoogleDrive" , "gdrive");
МодульСоставаОПИ.ДобавитьСтроку("Функция ПолучитьСоответствиеКомандМодулей() Экспорт");
МодульСоставаОПИ.ДобавитьСтроку("СоответствиеКомандМодулей = Новый Соответствие();");
Для Каждого КомандаМодуля Из СоответствиеМодулейКоманд Цикл
МодульСоставаОПИ.ДобавитьСтроку("СоответствиеКомандМодулей.Вставить("""
+ КомандаМодуля.Значение
+ """, """
+ КомандаМодуля.Ключ
+ """);");
КонецЦикла;
2024-04-07 11:10:56 +02:00
МодульСоставаОПИ.ДобавитьСтроку("Возврат СоответствиеКомандМодулей;");
МодульСоставаОПИ.ДобавитьСтроку("КонецФункции");
МодульСоставаОПИ.ДобавитьСтроку("");
МодульСоставаОПИ.ДобавитьСтроку("Функция ПолучитьСостав() Экспорт
|
| ТаблицаСостава = Новый ТаблицаЗначений();
| ТаблицаСостава.Колонки.Добавить(""Библиотека"");
| ТаблицаСостава.Колонки.Добавить(""Модуль"");
| ТаблицаСостава.Колонки.Добавить(""Метод"");
| ТаблицаСостава.Колонки.Добавить(""МетодПоиска"");
| ТаблицаСостава.Колонки.Добавить(""Параметр"");
| ТаблицаСостава.Колонки.Добавить(""Описание"");
| ТаблицаСостава.Колонки.Добавить(""ОписаниеМетода"");
|");
2024-04-07 11:10:56 +02:00
ТаблицаОписанийПараметров = Новый ТаблицаЗначений;
ТаблицаОписанийПараметров.Колонки.Добавить("Имя");
ТаблицаОписанийПараметров.Колонки.Добавить("Типы");
ТаблицаОписанийПараметров.Колонки.Добавить("Описание");
ТаблицаОписанийПараметров.Колонки.Добавить("ЗначениеПоУмолчанию");
ЗаполнитьТаблицуСостава();
МодульСоставаОПИ.ДобавитьСтроку(" Возврат ТаблицаСостава;");
МодульСоставаОПИ.ДобавитьСтроку("КонецФункции");
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
МодульСоставаОПИ.Записать(ФайлСоставаОПИ);
КонецПроцедуры
Процедура ЗаполнитьТаблицуСостава()
ФайлыМодулей = НайтиФайлы(КаталогБиблиотеки, "*.os");
Для Каждого Модуль Из ФайлыМодулей Цикл
ТекущийМодуль = Модуль.ИмяБезРасширения;
2024-04-07 11:10:56 +02:00
Если Не СоответствиеМодулейКоманд[ТекущийМодуль] = Неопределено Тогда
РазобратьМодуль(Модуль);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура РазобратьМодуль(Модуль)
Парсер = Новый ПарсерВстроенногоЯзыка;
ДокументМодуля = Новый ТекстовыйДокумент;
ДокументМодуля.Прочитать(Модуль.ПолноеИмя);
ТекстМодуля = ДокументМодуля.ПолучитьТекст();
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
Для Каждого Метод Из СтруктураМодуля.Объявления Цикл
Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда
2024-04-07 11:10:56 +02:00
ТаблицаОписанийПараметров.Очистить();
РазобратьКомментарийМетода(ДокументМодуля, Метод, Модуль);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
2024-04-07 11:10:56 +02:00
Процедура РазобратьКомментарийМетода(ТекстовыйДокумент, Метод, Модуль)
НомерСтроки = Метод.Начало.НомерСтроки;
ИмяМетода = Метод.Сигнатура.Имя;
МассивКомментария = ПарсингКомментария(ТекстовыйДокумент, НомерСтроки);
Если МассивКомментария.Количество() = 0 Тогда
Возврат;
КонецЕсли;
МассивПараметров = Новый Массив;
ОписаниеМетода = "";
СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров, ОписаниеМетода);
СформироватьТаблицуОписанийПараметров(МассивПараметров, Метод);
ДопОписание = "";
ОпределитьДопОписание(ДопОписание, Модуль);
ОписаниеМетода = СокрЛП(ОписаниеМетода) + ДопОписание;
Для Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл
ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, СокрЛП(ОписаниеМетода));
ОписаниеМетода = "";
КонецЦикла;
КонецПроцедуры
Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки)
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1);
ТекстКомментария = ТекущаяСтрока;
2024-04-07 11:10:56 +02:00
Счетчик = 1;
2024-04-09 08:30:03 +02:00
Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл
Счетчик = Счетчик + 1;
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик);
ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария;
КонецЦикла;
Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда
2024-04-07 11:10:56 +02:00
Возврат Новый Массив;
КонецЕсли;
2024-04-09 08:30:03 +02:00
МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь);
2024-04-03 19:55:37 +02:00
Если МассивКомментария.Количество() = 0 Тогда
Сообщить(ТекстКомментария);
2024-04-07 11:10:56 +02:00
Возврат Новый Массив;
2024-04-03 19:55:37 +02:00
Иначе
МассивКомментария.Удалить(0);
КонецЕсли;
2024-04-07 11:10:56 +02:00
Возврат МассивКомментария;
КонецФункции
Процедура СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров, ОписаниеМетода)
ЗаписыватьПараметры = Ложь;
ЗаписыватьОписание = Истина;
Счетчик = 0;
Для Каждого СтрокаКомментария Из МассивКомментария Цикл
Счетчик = Счетчик + 1;
Если Не ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) Тогда
ЗаписыватьОписание = Ложь;
КонецЕсли;
Если ЗаписыватьОписание = Истина И Счетчик > 1 Тогда
ОписаниеМетода = ?(ЗначениеЗаполнено(ОписаниеМетода), ОписаниеМетода + " | ", ОписаниеМетода)
+ СтрокаКомментария;
КонецЕсли;
Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда
ЗаписыватьПараметры = Истина;
ЗаписыватьОписание = Ложь;
ИначеЕсли СтрНайти(СтрокаКомментария, "Возвращаемое значение:") > 0 Тогда
Прервать;
ИначеЕсли ЗаписыватьПараметры = Истина
И ЗначениеЗаполнено(СокрЛП(СтрокаКомментария))
И Не СтрНачинаетсяС(СокрЛП(СтрокаКомментария), "*") = 0 Тогда
МассивПараметров.Добавить(СтрокаКомментария);
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
2024-04-07 11:10:56 +02:00
КонецПроцедуры
2024-04-07 11:10:56 +02:00
Процедура СформироватьТаблицуОписанийПараметров(Знач МассивПараметров, Знач Метод)
Разделитель = "-";
2024-04-07 11:10:56 +02:00
Для Каждого ПараметрМетода Из МассивПараметров Цикл
2024-04-07 11:10:56 +02:00
МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь);
КоличествоЭлементов = МассивЭлементовПараметра.Количество();
Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл
МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]);
КонецЦикла;
Если КоличествоЭлементов < 4 Тогда
Возврат;
КонецЕсли;
Имя1С = МассивЭлементовПараметра[0];
Имя = "--" + МассивЭлементовПараметра[3];
Типы = МассивЭлементовПараметра[1];
Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]);
НоваяСтрокаТаблицы = ТаблицаОписанийПараметров.Добавить();
НоваяСтрокаТаблицы.Имя = Имя;
НоваяСтрокаТаблицы.Типы = Типы;
НоваяСтрокаТаблицы.Описание = Описание;
НоваяСтрокаТаблицы.ЗначениеПоУмолчанию = ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод);
КонецЦикла;
КонецПроцедуры
2024-04-07 11:10:56 +02:00
Функция ПолучитьЗначениеПараметраПоУмолчанию(Знач Имя, Знач Метод)
2024-04-07 11:10:56 +02:00
Значение = "";
2024-04-07 11:10:56 +02:00
Для Каждого ПараметрМетода Из Метод.Сигнатура.Параметры Цикл
2024-04-07 11:10:56 +02:00
Если ПараметрМетода.Имя = Имя Тогда
2024-04-07 11:10:56 +02:00
ЗначениеПараметра = ПараметрМетода.Значение;
Если ЗначениеЗаполнено(ЗначениеПараметра) Тогда
Попытка
Значение = ЗначениеПараметра["Элементы"][0]["Значение"];
Исключение
Значение = ЗначениеПараметра.Значение;
КонецПопытки;
Значение = ?(ЗначениеЗаполнено(Значение), Значение, "Пустое значение");
КонецЕсли;
2024-04-07 11:10:56 +02:00
КонецЕсли;
2024-04-07 11:10:56 +02:00
КонецЦикла;
2024-04-07 11:10:56 +02:00
Возврат Значение;
2024-04-07 11:10:56 +02:00
КонецФункции
2024-04-07 11:10:56 +02:00
Процедура ОпределитьДопОписание(ДопОписание, Модуль)
НачалоПараметров = Ложь;
ЕстьМассив = Ложь;
ЕстьДата = Ложь;
ТекстДополнения = "";
2024-04-07 11:10:56 +02:00
ИмяМодуля = Модуль.ИмяБезРасширения;
2024-04-07 11:10:56 +02:00
ДЛя Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл
2024-04-07 11:10:56 +02:00
Типы = СтрокаПараметра["Типы"];
Имя = СтрокаПараметра["Имя"];
2024-04-07 11:10:56 +02:00
Если СтрНайти(Типы, "Массив") > 0 Тогда
ЕстьМассив = Истина;
КонецЕсли;
Если СтрНайти(Типы, "Дата") > 0 Тогда
ЕстьДата = Истина;
КонецЕсли;
2024-04-07 11:10:56 +02:00
ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, Имя)
КонецЦикла;
Если ЕстьМассив Тогда
2024-04-07 11:10:56 +02:00
ТекстДополнения =
"
2024-04-06 19:20:36 +02:00
| Пример указания параметра типа массив:
| --param ""['Val1','Val2','Val3']""
2024-04-07 11:10:56 +02:00
|" + ТекстДополнения;
КонецЕсли;
Если ЕстьДата Тогда
ТекстДополнения =
"
| Дата указывается в формате ISO 8601:
| ""2024-04-07""
| ""2024-04-07T13:34:42+00:00""
| ""2024-04-07T13:34:42Z""
|" + ТекстДополнения;
КонецЕсли;
2024-04-07 00:09:48 +02:00
ТекстДополнения = СтрЗаменить(ТекстДополнения, Символы.ПС, Символы.ПС + " |");
2024-04-07 11:10:56 +02:00
ДопОписание = ДопОписание + СтрЗаменить(ТекстДополнения, """", """""");
КонецПроцедуры
Процедура ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, ИмяПараметра)
Если ИмяМодуля = "OPI_VK" Тогда
Если ИмяПараметра = "--auth" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных авторизации (параметр --auth):
| {
| ""access_token"": """", // Можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
| ""owner_id"" : """", // id группы с ""-"" в начале. Можно найти в настройках группы ВК или в ее URL
| ""app_id"" : """", // id приложения, которое необходимо создать в профиле на странице для разработчиков
| ""group_id"" : """" // owner_id, но без ""-""
2024-04-07 11:10:56 +02:00
| }
|
|";
2024-04-07 17:48:34 +02:00
ИначеЕсли ИмяПараметра = "--product" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных описания товара (параметр --product):
| {
| ""Имя"" : ""Новый товар"",
| ""Описание"" : ""Описание товара"",
| ""Категория"" : ""20173"",
| ""Цена"" : 1,
| ""СтараяЦена"" : """",
| ""ОсновноеФото"" : """",
| ""URL"" : """",
| ""ДополнительныеФото"" : [],
| ""ЗначенияСвойств"" : [],
| ""ГлавныйВГруппе"" : ""Ложь"",
| ""Ширина"" : """",
| ""Высота"" : """",
| ""Глубина"" : """",
| ""Вес"" : """",
| ""SKU"" : """",
| ""ДоступныйОстаток"" : ""1""
| }
|
|";
2024-04-07 11:10:56 +02:00
КонецЕсли;
КонецЕсли;
Если ИмяМодуля = "OPI_Telegram" Тогда
Если ИмяПараметра = "--media" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных медиагруппы (параметр --media):
| {
| ""ПутьКФайлу"": ""ТипМедиа"",
| ""ПутьКФайлу"": ""ТипМедиа"",
| ...
| }
|";
КонецЕсли;
КонецЕсли;
2024-04-07 17:48:34 +02:00
Если ИмяМодуля = "OPI_Twitter" Тогда
Если ИмяПараметра = "--auth" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных авторизации (параметр --auth):
| {
| ""redirect_uri"" : """", // URL вашего http-сервиса (или другого обработчика запросов) для авторизации
| ""client_id"" : """", // Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
| ""client_secret"" : """", // Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
| ""access_token"" : """", // ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code)
| ""refresh_token"" : """", // Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч)
| ""oauth_token"" : """", // Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
| ""oauth_token_secret"" : """", // Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
| ""oauth_consumer_key"" : """", // Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
| ""oauth_consumer_secret"" : """" // Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
| }
|";
КонецЕсли;
КонецЕсли;
Если ИмяМодуля = "OPI_Notion" Тогда
Если ИмяПараметра = "--data" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных страницы (параметр --data):
| {
| ""Имя поля БД 1"" : ""Значение1"",
| ""Имя поля БД 2"" : ""Значение2"",
| ...
| }
|";
ИначеЕсли ИмяПараметра = "--props" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON полей базы (параметр --props):
| {
| ""Имя поля БД c обычным типом"" : ""Тип данных 1"",
| ""Имя поля БД с выбором значения"" :
| {
| ""Вариант1"" : ""green"",
| ""Вариант2"" : ""red"",
| ...
| },
| ...
2024-04-07 17:48:34 +02:00
| }
|
| Доуступные типы: title(ключевой), rich_text, number, status,
| date, files, checkbox, url, email, phone_number, people
2024-04-07 17:48:34 +02:00
|";
КонецЕсли;
КонецЕсли;
Если ИмяМодуля = "OPI_GoogleCalendar" Тогда
Если ИмяПараметра = "--props" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных события (параметр --props):
| {
| ""Описание"" : """", // Описание события
| ""Заголовок"" : """", // Заголовок события
| ""МестоПроведения"" : """", // Строка описание места проведения
| ""ДатаНачала"" : """", // Дата начала события
| ""ДатаОкончания"" : """", // Дата окончания события
| ""МассивURLФайловВложений"" : // Ключ - название, Значение - URL к файлу
| {
| ""НазваниеФайла1"" : ""URLФайла1"",
| ""НазваниеФайла2"" : ""URLФайла2"",
| ...
| },
| ""ОтправлятьУведомления"" : true // Признак отправки уведомлений участникам
| }
|";
КонецЕсли;
КонецЕсли;
Если ИмяМодуля = "OPI_GoogleDrive" Тогда
Если ИмяПараметра = "--props" Тогда
ТекстДополнения = ТекстДополнения + "
|
| Структура JSON данных объекта (параметр --props):
| {
| ""MIME"" , ""image/jpeg""); // MIME-тип загружаемого файла
| ""Имя"" , ""Новый файл.jpg""); // Имя файла с расширением
| ""Описание"" , ""Это новый файл""); // Описание файла
| ""Родитель"" , ""root""); // ID каталога загрузки или ""root"" для загрузки в корень
| }
|";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2024-04-07 11:10:56 +02:00
Процедура ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, ОписаниеМетода = "")
2024-04-06 19:10:31 +02:00
Имя = СтрокаПараметра["Имя"];
Описание = СтрокаПараметра["Описание"];
Значение = СтрокаПараметра["ЗначениеПоУмолчанию"];
Библиотека = СоответствиеМодулейКоманд.Получить(ТекущийМодуль);
2024-04-06 19:10:31 +02:00
2024-04-07 11:10:56 +02:00
Если ЗначениеЗаполнено(Значение) Тогда
Описание = Описание + " (необяз. по ум. - " + Значение + ")";
КонецЕсли;
2024-04-06 19:10:31 +02:00
2024-04-07 11:10:56 +02:00
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
2024-04-07 11:10:56 +02:00
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока = ТаблицаСостава.Добавить();");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Библиотека = """ + Библиотека + """;");
2024-04-07 11:10:56 +02:00
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Модуль = """ + ТекущийМодуль + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Метод = """ + ИмяМетода + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.МетодПоиска = """ + вРег(ИмяМетода) + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Параметр = """ + Имя + """;");
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Описание = """ + Описание + """;");
2024-04-07 11:10:56 +02:00
Если ЗначениеЗаполнено(ОписаниеМетода) Тогда
МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.ОписаниеМетода = """ + ОписаниеМетода + """;");
КонецЕсли;
2024-04-06 19:10:31 +02:00
2024-04-07 11:10:56 +02:00
МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС);
КонецПроцедуры
2024-04-06 19:10:31 +02:00
ПриСозданииОбъекта();