1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-10 22:41:43 +02:00

Main build (Jenkins)

This commit is contained in:
Vitaly the Alpaca (bot)
2025-02-05 21:10:03 +03:00
parent 8c12fd89d9
commit 7962bb1d0e
10 changed files with 9530 additions and 9086 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -42,6 +42,7 @@
// Uncomment if OneScript is executed
#Use "./internal"
#Use "../../data"
#Use asserts
#Region Internal
@@ -537,6 +538,12 @@ Function ExecuteTestCLI(Val Library, Val Method, Val Options, Val Record = True)
If Record Then
WriteCLICall(Library, Method, Options);
Try
WriteSwaggerPage(Library, Method, Options);
Except
Message("Swagger: " + ErrorDescription());
EndTry;
EndIf;
Try
@@ -2478,13 +2485,218 @@ Procedure WriteSwaggerPage(Val Library, Val Method, Val Options)
Return;
EndIf;
PagesCatalog = SwaggerCatalog();
PagesCatalog = SwaggerCatalog();
LibraryCatalog = PagesCatalog + Library + "/";
MethodFile = LibraryCatalog + Method + ".json";
SimplestMethod = DefineSimplestHttpMethod(Options);
OintComposition = New("LibraryComposition");
LibraryComposition = OintComposition.GetComposition(Library);
MethodContent = LibraryComposition.FindRows(New Structure("Method", Method));
OptionsTable = New ValueTable;
OptionsTable.Columns.Add("Key");
OptionsTable.Columns.Add("Value");
OptionsTable.Columns.Add("Description");
For Each ContentString In MethodContent Do
NewLine = OptionsTable.Add();
NewLine.Key = StrReplace(ContentString.Parameter, "--", "");
NewLine.Description = ContentString.Description;
OPI_Tools.CollectionFieldExist(Options, NewLine.Option, NewLine.Value);
EndDo;
DescriptionStructure = New Structure;
If SimplestMethod = "GET" Then
DescriptionStructure.Insert("get", MakeDescriptionGet(OptionsTable));
EndIf;
NeedJSONVariant = SimplestMethod = "GET" Or SimplestMethod = "POST";
DescriptionStructure.Insert("post", MakeDescriptionPost(OptionsTable, NeedJSONVariant));
OPI_Tools.WriteJSONFile(DescriptionStructure, MethodFile);
EndProcedure
Function DefineSimplestHttpMethod(Val Options)
BinaryExist = False;
FindJSON = False;
For Each Option In Options Do
Value = Option.Value;
Key = Option.Key;
If Key = "out" Then
Continue;
EndIf;
If TypeOf(Value) = Type("BinaryData") Then
BinaryExist = True;
Break;
ElsIf TypeOf(Value) = Type("String") Then
ValueFile = New File(Value);
If ValueFile.Exist() And ValueFile.IsFile() Then
BinaryExist = True;
Break;
Else
OPI_TypeConversion.GetCollection(Value);
EndIf;
EndIf;
CurrentType = TypeOf(Value);
If CurrentType = Type("Map") Or CurrentType = Type("Structure") Then
FindJSON = True;
EndIf;
EndDo;
If Not BinaryExist And Not FindJSON Then
Method = "GET";
ElsIf Not BinaryExist Then
Method = "POST";
Else
Method = "FORM";
EndIf;
Return Method;
EndFunction
Function MakeDescriptionGet(Val OptionsTable)
DescriptionStructure = New Structure;
DescriptionStructure.Insert("summary", "Execution via GET method");
ParameterArray = New Array;
TypesMap = SwaggerTypesMap();
For Each Option In OptionsTable Do
Key = Option.Key;
Value = Option.Value;
Description = Option.Description;
ParameterStructure = New Structure;
ParameterStructure.Insert("name", Key);
ParameterStructure.Insert("in" , "query");
SwaggerType = TypesMap.Get(TypeOf(Value));
SwaggerType = ?(ValueIsFilled(SwaggerType), SwaggerType, TypesMap.Get(Type("String")));
ParameterStructure.Insert("schema" , SwaggerType);
ParameterStructure.Insert("description", Description);
ParameterArray.Add(ParameterStructure);
EndDo;
DescriptionStructure.Insert("parameters", ParameterArray);
Return DescriptionStructure;
EndFunction
Function MakeDescriptionPost(Val OptionsTable, Val NeedJSONVariant)
Description = "Execution via POST method (%1)";
Description = StrTemplate(Description, ?(NeedJSONVariant, "JSON or form-data", "form-data"));
DescriptionStructure = New Structure;
DescriptionStructure.Insert("summary", Description);
BodyStructure = New Structure;
BodyStructure.Insert("required", True);
BodyVariantsMap = MakeBodyVariants(OptionsTable, NeedJSONVariant);
BodyStructure.Insert("content", BodyVariantsMap);
DescriptionStructure.Insert("requestBody", BodyStructure);
Return DescriptionStructure;
EndFunction
Function MakeBodyVariants(Val OptionsTable, Val NeedJSONVariant)
TypesMap = SwaggerTypesMap();
BodyStructure = New Structure;
SchemeStructure = New Structure;
SchemeStructure.Insert("type", "object");
PropertiesStructure = New Structure;
For Each Option In OptionsTable Do
Key = Option.Key;
Value = Option.Value;
Description = Option.Description;
PropertyStructure = New Structure;
SwaggerType = TypesMap.Get(TypeOf(Value));
SwaggerType = ?(ValueIsFilled(SwaggerType), SwaggerType, TypesMap.Get(Type("String")));
PropertyStructure.Insert("type" , SwaggerType);
PropertyStructure.Insert("description", Description);
PropertiesStructure.Insert(Key, PropertyStructure);
EndDo;
SchemeStructure.Insert("properties", PropertiesStructure);
BodyStructure.Insert("schema", SchemeStructure);
VariantsMap = New Map;
VariantsMap.Insert("multipart/form-data", BodyStructure);
If NeedJSONVariant Then
VariantsMap.Insert("application/json", BodyStructure);
EndIf;
Return VariantsMap;
EndFunction
Function SwaggerTypesMap()
TypesMap = New Map;
TypesMap.Insert(Type("String") , New Structure("type" , "string"));
TypesMap.Insert(Type("Date") , New Structure("type,format", "string", "date-time"));
TypesMap.Insert(Type("Number") , New Structure("type" , "number"));
TypesMap.Insert(Type("Boolean") , New Structure("type" , "boolean"));
TypesMap.Insert(Type("Array") , New Structure("type,items" , "array" , New Structure("type","string")));
TypesMap.Insert(Type("Structure") , New Structure("type" , "object"));
TypesMap.Insert(Type("Map") , New Structure("type" , "object"));
TypesMap.Insert(Type("BinaryData"), New Structure("type" , "file"));
Return TypesMap;
EndFunction
Function SwaggerCatalog()
Return "./docs/ru/openapi/"
Return "./docs/ru/openapi/";
EndFunction
#EndRegion

View File

@@ -520,6 +520,16 @@ Function ReadJSONFile(Val Path) Export
EndFunction
Procedure WriteJSONFile(Data, Path) Export
JSONWriter = New JSONWriter;
JSONWriter.OpenFile(Path, , , New JSONWriterSettings(, Chars.Tab));
WriteJSON(JSONWriter, Data);
JSONWriter.Close();
EndProcedure
#EndRegion
#Region XML

View File

@@ -42,6 +42,7 @@
// Uncomment if OneScript is executed
// #Use "./internal"
// #Use "../../data"
// #Use asserts
#Region Internal
@@ -537,6 +538,12 @@ Function ExecuteTestCLI(Val Library, Val Method, Val Options, Val Record = True)
If Record Then
WriteCLICall(Library, Method, Options);
Try
WriteSwaggerPage(Library, Method, Options);
Except
Message("Swagger: " + ErrorDescription());
EndTry;
EndIf;
Try
@@ -2478,13 +2485,218 @@ Procedure WriteSwaggerPage(Val Library, Val Method, Val Options)
Return;
EndIf;
PagesCatalog = SwaggerCatalog();
PagesCatalog = SwaggerCatalog();
LibraryCatalog = PagesCatalog + Library + "/";
MethodFile = LibraryCatalog + Method + ".json";
SimplestMethod = DefineSimplestHttpMethod(Options);
OintComposition = New("LibraryComposition");
LibraryComposition = OintComposition.GetComposition(Library);
MethodContent = LibraryComposition.FindRows(New Structure("Method", Method));
OptionsTable = New ValueTable;
OptionsTable.Columns.Add("Key");
OptionsTable.Columns.Add("Value");
OptionsTable.Columns.Add("Description");
For Each ContentString In MethodContent Do
NewLine = OptionsTable.Add();
NewLine.Key = StrReplace(ContentString.Parameter, "--", "");
NewLine.Description = ContentString.Description;
OPI_Tools.CollectionFieldExists(Options, NewLine.Option, NewLine.Value);
EndDo;
DescriptionStructure = New Structure;
If SimplestMethod = "GET" Then
DescriptionStructure.Insert("get", MakeDescriptionGet(OptionsTable));
EndIf;
NeedJSONVariant = SimplestMethod = "GET" Or SimplestMethod = "POST";
DescriptionStructure.Insert("post", MakeDescriptionPost(OptionsTable, NeedJSONVariant));
OPI_Tools.WriteJSONFile(DescriptionStructure, MethodFile);
EndProcedure
Function DefineSimplestHttpMethod(Val Options)
BinaryExists = False;
FindJSON = False;
For Each Option In Options Do
Value = Option.Value;
Key = Option.Key;
If Key = "out" Then
Continue;
EndIf;
If TypeOf(Value) = Type("BinaryData") Then
BinaryExists = True;
Break;
ElsIf TypeOf(Value) = Type("String") Then
ValueFile = New File(Value);
If ValueFile.Exists() And ValueFile.IsFile() Then
BinaryExists = True;
Break;
Else
OPI_TypeConversion.GetCollection(Value);
EndIf;
EndIf;
CurrentType = TypeOf(Value);
If CurrentType = Type("Map") Or CurrentType = Type("Structure") Then
FindJSON = True;
EndIf;
EndDo;
If Not BinaryExists And Not FindJSON Then
Method = "GET";
ElsIf Not BinaryExists Then
Method = "POST";
Else
Method = "FORM";
EndIf;
Return Method;
EndFunction
Function MakeDescriptionGet(Val OptionsTable)
DescriptionStructure = New Structure;
DescriptionStructure.Insert("summary", "Execution via GET method");
ParameterArray = New Array;
TypesMap = SwaggerTypesMap();
For Each Option In OptionsTable Do
Key = Option.Key;
Value = Option.Value;
Description = Option.Description;
ParameterStructure = New Structure;
ParameterStructure.Insert("name", Key);
ParameterStructure.Insert("in" , "query");
SwaggerType = TypesMap.Get(TypeOf(Value));
SwaggerType = ?(ValueIsFilled(SwaggerType), SwaggerType, TypesMap.Get(Type("String")));
ParameterStructure.Insert("schema" , SwaggerType);
ParameterStructure.Insert("description", Description);
ParameterArray.Add(ParameterStructure);
EndDo;
DescriptionStructure.Insert("parameters", ParameterArray);
Return DescriptionStructure;
EndFunction
Function MakeDescriptionPost(Val OptionsTable, Val NeedJSONVariant)
Description = "Execution via POST method (%1)";
Description = StrTemplate(Description, ?(NeedJSONVariant, "JSON or form-data", "form-data"));
DescriptionStructure = New Structure;
DescriptionStructure.Insert("summary", Description);
BodyStructure = New Structure;
BodyStructure.Insert("required", True);
BodyVariantsMap = MakeBodyVariants(OptionsTable, NeedJSONVariant);
BodyStructure.Insert("content", BodyVariantsMap);
DescriptionStructure.Insert("requestBody", BodyStructure);
Return DescriptionStructure;
EndFunction
Function MakeBodyVariants(Val OptionsTable, Val NeedJSONVariant)
TypesMap = SwaggerTypesMap();
BodyStructure = New Structure;
SchemeStructure = New Structure;
SchemeStructure.Insert("type", "object");
PropertiesStructure = New Structure;
For Each Option In OptionsTable Do
Key = Option.Key;
Value = Option.Value;
Description = Option.Description;
PropertyStructure = New Structure;
SwaggerType = TypesMap.Get(TypeOf(Value));
SwaggerType = ?(ValueIsFilled(SwaggerType), SwaggerType, TypesMap.Get(Type("String")));
PropertyStructure.Insert("type" , SwaggerType);
PropertyStructure.Insert("description", Description);
PropertiesStructure.Insert(Key, PropertyStructure);
EndDo;
SchemeStructure.Insert("properties", PropertiesStructure);
BodyStructure.Insert("schema", SchemeStructure);
VariantsMap = New Map;
VariantsMap.Insert("multipart/form-data", BodyStructure);
If NeedJSONVariant Then
VariantsMap.Insert("application/json", BodyStructure);
EndIf;
Return VariantsMap;
EndFunction
Function SwaggerTypesMap()
TypesMap = New Map;
TypesMap.Insert(Type("String") , New Structure("type" , "string"));
TypesMap.Insert(Type("Date") , New Structure("type,format", "string", "date-time"));
TypesMap.Insert(Type("Number") , New Structure("type" , "number"));
TypesMap.Insert(Type("Boolean") , New Structure("type" , "boolean"));
TypesMap.Insert(Type("Array") , New Structure("type,items" , "array" , New Structure("type","string")));
TypesMap.Insert(Type("Structure") , New Structure("type" , "object"));
TypesMap.Insert(Type("Map") , New Structure("type" , "object"));
TypesMap.Insert(Type("BinaryData"), New Structure("type" , "file"));
Return TypesMap;
EndFunction
Function SwaggerCatalog()
Return "./docs/ru/openapi/"
Return "./docs/ru/openapi/";
EndFunction
#EndRegion

View File

@@ -520,6 +520,16 @@ Function ReadJSONFile(Val Path) Export
EndFunction
Procedure WriteJSONFile(Data, Path) Export
JSONWriter = New JSONWriter;
JSONWriter.OpenFile(Path, , , New JSONWriterSettings(, Chars.Tab));
WriteJSON(JSONWriter, Data);
JSONWriter.Close();
EndProcedure
#EndRegion
#Region XML

View File

@@ -254,9 +254,9 @@
Иначе
ТекстВыполнения = СтруктураВыполнения["Результат"];
Выполнить(ТекстВыполнения);
Ответ = Новый Структура("result,data", Истина, Ответ);

View File

@@ -538,7 +538,7 @@
Если Записывать Тогда
ЗаписатьВызовCLI(Библиотека, Метод, Опции);
Попытка
ЗаписатьСтраницуSwagger(Библиотека, Метод, Опции);
Исключение
@@ -2196,9 +2196,9 @@
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
@@ -2484,215 +2484,215 @@
Если Не OPI_Инструменты.ЭтоOneScript() Тогда
Возврат;
КонецЕсли;
КаталогСтраниц = КаталогSwagger();
КаталогБиблиотеки = КаталогСтраниц + Библиотека + "/";
ФайлМетода = КаталогБиблиотеки + Метод + ".json";
ПростейшийМетод = ОпределитьПростейшийHttpМетод(Опции);
СоставОПИ = Новый("LibraryComposition");
СоставБиблиотеки = СоставОПИ.ПолучитьСостав(Библиотека);
СоставМетода = СоставБиблиотеки.НайтиСтроки(Новый Структура("Метод", Метод));
ТаблицаОпций = Новый ТаблицаЗначений;
ТаблицаОпций.Колонки.Добавить("Ключ");
ТаблицаОпций.Колонки.Добавить("Значение");
ТаблицаОпций.Колонки.Добавить("Описание");
Для Каждого СтрокаСостава Из СоставМетода Цикл
НоваяСтрока = ТаблицаОпций.Добавить();
НоваяСтрока = ТаблицаОпций.Добавить();
НоваяСтрока.Ключ = СтрЗаменить(СтрокаСостава.Параметр, "--", "");
НоваяСтрока.Описание = СтрокаСостава.Описание;
OPI_Инструменты.ПолеКоллекцииСуществует(Опции, НоваяСтрока.Опция, НоваяСтрока.Значение);
КонецЦикла;
КонецЦикла;
СтруктураОписания = Новый Структура;
Если ПростейшийМетод = "GET" Тогда
СтруктураОписания.Вставить("get", ПолучитьОписаниеGet(ТаблицаОпций));
КонецЕсли;
ЕстьВариантJSON = ПростейшийМетод = "GET" Или ПростейшийМетод = "POST";
СтруктураОписания.Вставить("post", ПолучитьОписаниеPost(ТаблицаОпций, ЕстьВариантJSON));
OPI_Инструменты.ЗаписатьJSONФайл(СтруктураОписания, ФайлМетода);
КонецПроцедуры
Функция ОпределитьПростейшийHttpМетод(Знач Опции)
ЕстьДвоичные = Ложь;
ЕстьJSON = Ложь;
Для Каждого Опция Из Опции Цикл
Значение = Опция.Значение;
Ключ = Опция.Ключ;
Если Ключ = "out" Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
ЕстьДвоичные = Истина;
Прервать;
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
ФайлЗначения = Новый Файл(Значение);
Если ФайлЗначения.Существует() И ФайлЗначения.ЭтоФайл() Тогда
ЕстьДвоичные = Истина;
Прервать;
Иначе
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение);
КонецЕсли;
КонецЕсли;
ТекущийТип = ТипЗнч(Значение);
Если ТекущийТип = Тип("Соответствие") Или ТекущийТип = Тип("Структура") Тогда
ЕстьJSON = Истина;
КонецЕсли;
КонецЦикла;
Если Не ЕстьДвоичные И Не ЕстьJSON Тогда
Метод = "GET";
Метод = "GET";
ИначеЕсли Не ЕстьДвоичные Тогда
Метод = "POST";
Иначе
Метод = "FORM";
КонецЕсли;
Возврат Метод;
КонецФункции
Функция ПолучитьОписаниеGet(Знач ТаблицаОпций)
СтруктураОписания = Новый Структура;
СтруктураОписания.Вставить("summary", "Выполнение через метод GET");
МассивПараметров = Новый Массив;
СоответствиеТипов = СоответствиеТиповSwagger();
Для Каждого Опция Из ТаблицаОпций Цикл
Ключ = Опция.Ключ;
Значение = Опция.Значение;
Описание = Опция.Описание;
СтруктураПараметра = Новый Структура;
СтруктураПараметра.Вставить("name", Ключ);
СтруктураПараметра.Вставить("in" , "query");
ТипSwagger = СоответствиеТипов.Получить(ТипЗнч(Значение));
ТипSwagger = ?(ЗначениеЗаполнено(ТипSwagger), ТипSwagger, СоответствиеТипов.Получить(Тип("Строка")));
СтруктураПараметра.Вставить("schema" , ТипSwagger);
СтруктураПараметра.Вставить("description", Описание);
МассивПараметров.Добавить(СтруктураПараметра);
КонецЦикла;
СтруктураОписания.Вставить("parameters", МассивПараметров);
Возврат СтруктураОписания;
КонецФункции
Функция ПолучитьОписаниеPost(Знач ТаблицаОпций, Знач ЕстьВариантJSON)
Описание = "Выполнение через метод POST (%1)";
Описание = СтрШаблон(Описание, ?(ЕстьВариантJSON, "JSON или form-data", "form-data"));
СтруктураОписания = Новый Структура;
СтруктураОписания.Вставить("summary", Описание);
СтруктураТела = Новый Структура;
СтруктураТела.Вставить("required", Истина);
СоответствиеВариантовТела = СформироватьВариантыТела(ТаблицаОпций, ЕстьВариантJSON);
СтруктураТела.Вставить("content", СоответствиеВариантовТела);
СтруктураОписания.Вставить("requestBody", СтруктураТела);
Возврат СтруктураОписания;
КонецФункции
Функция СформироватьВариантыТела(Знач ТаблицаОпций, Знач ЕстьВариантJSON)
СоответствиеТипов = СоответствиеТиповSwagger();
СтруктураТела = Новый Структура;
СтруктураСхемы = Новый Структура;
СтруктураСхемы.Вставить("type", "object");
СтруктураСвойств = Новый Структура;
Для Каждого Опция Из ТаблицаОпций Цикл
Ключ = Опция.Ключ;
Значение = Опция.Значение;
Описание = Опция.Описание;
СтруктураСвойства = Новый Структура;
ТипSwagger = СоответствиеТипов.Получить(ТипЗнч(Значение));
ТипSwagger = ?(ЗначениеЗаполнено(ТипSwagger), ТипSwagger, СоответствиеТипов.Получить(Тип("Строка")));
СтруктураСвойства.Вставить("type" , ТипSwagger);
СтруктураСвойства.Вставить("description", Описание);
СтруктураСвойств.Вставить(Ключ, СтруктураСвойства);
КонецЦикла;
СтруктураСхемы.Вставить("properties", СтруктураСвойств);
СтруктураТела.Вставить("schema", СтруктураСхемы);
СоответствиеВариантов = Новый Соответствие;
СоответствиеВариантов.Вставить("multipart/form-data", СтруктураТела);
Если ЕстьВариантJSON Тогда
СоответствиеВариантов.Вставить("application/json", СтруктураТела);
КонецЕсли;
Возврат СоответствиеВариантов;
КонецФункции
Функция СоответствиеТиповSwagger()
СоответствиеТипов = Новый Соответствие;
СоответствиеТипов.Вставить(Тип("Строка") , Новый Структура("type", "string"));
СоответствиеТипов.Вставить(Тип("Строка") , Новый Структура("type" , "string"));
СоответствиеТипов.Вставить(Тип("Дата") , Новый Структура("type,format", "string", "date-time"));
СоответствиеТипов.Вставить(Тип("Число") , Новый Структура("type", "number"));
СоответствиеТипов.Вставить(Тип("Булево") , Новый Структура("type", "boolean"));
СоответствиеТипов.Вставить(Тип("Массив") , Новый Структура("type,items", "array", Новый Структура("type","string")));
СоответствиеТипов.Вставить(Тип("Структура") , Новый Структура("type", "object"));
СоответствиеТипов.Вставить(Тип("Соответствие") , Новый Структура("type", "object"));
СоответствиеТипов.Вставить(Тип("ДвоичныеДанные"), Новый Структура("type", "file"));
СоответствиеТипов.Вставить(Тип("Число") , Новый Структура("type" , "number"));
СоответствиеТипов.Вставить(Тип("Булево") , Новый Структура("type" , "boolean"));
СоответствиеТипов.Вставить(Тип("Массив") , Новый Структура("type,items" , "array" , Новый Структура("type","string")));
СоответствиеТипов.Вставить(Тип("Структура") , Новый Структура("type" , "object"));
СоответствиеТипов.Вставить(Тип("Соответствие") , Новый Структура("type" , "object"));
СоответствиеТипов.Вставить(Тип("ДвоичныеДанные"), Новый Структура("type" , "file"));
Возврат СоответствиеТипов;
КонецФункции
Функция КаталогSwagger()

View File

@@ -538,7 +538,7 @@
Если Записывать Тогда
ЗаписатьВызовCLI(Библиотека, Метод, Опции);
Попытка
ЗаписатьСтраницуSwagger(Библиотека, Метод, Опции);
Исключение
@@ -2484,215 +2484,215 @@
Если Не OPI_Инструменты.ЭтоOneScript() Тогда
Возврат;
КонецЕсли;
КаталогСтраниц = КаталогSwagger();
КаталогБиблиотеки = КаталогСтраниц + Библиотека + "/";
ФайлМетода = КаталогБиблиотеки + Метод + ".json";
ПростейшийМетод = ОпределитьПростейшийHttpМетод(Опции);
СоставОПИ = Новый("LibraryComposition");
СоставБиблиотеки = СоставОПИ.ПолучитьСостав(Библиотека);
СоставМетода = СоставБиблиотеки.НайтиСтроки(Новый Структура("Метод", Метод));
ТаблицаОпций = Новый ТаблицаЗначений;
ТаблицаОпций.Колонки.Добавить("Ключ");
ТаблицаОпций.Колонки.Добавить("Значение");
ТаблицаОпций.Колонки.Добавить("Описание");
Для Каждого СтрокаСостава Из СоставМетода Цикл
НоваяСтрока = ТаблицаОпций.Добавить();
НоваяСтрока = ТаблицаОпций.Добавить();
НоваяСтрока.Ключ = СтрЗаменить(СтрокаСостава.Параметр, "--", "");
НоваяСтрока.Описание = СтрокаСостава.Описание;
OPI_Инструменты.ПолеКоллекцииСуществует(Опции, НоваяСтрока.Опция, НоваяСтрока.Значение);
КонецЦикла;
КонецЦикла;
СтруктураОписания = Новый Структура;
Если ПростейшийМетод = "GET" Тогда
СтруктураОписания.Вставить("get", ПолучитьОписаниеGet(ТаблицаОпций));
КонецЕсли;
ЕстьВариантJSON = ПростейшийМетод = "GET" Или ПростейшийМетод = "POST";
СтруктураОписания.Вставить("post", ПолучитьОписаниеPost(ТаблицаОпций, ЕстьВариантJSON));
OPI_Инструменты.ЗаписатьJSONФайл(СтруктураОписания, ФайлМетода);
КонецПроцедуры
Функция ОпределитьПростейшийHttpМетод(Знач Опции)
ЕстьДвоичные = Ложь;
ЕстьJSON = Ложь;
Для Каждого Опция Из Опции Цикл
Значение = Опция.Значение;
Ключ = Опция.Ключ;
Если Ключ = "out" Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
ЕстьДвоичные = Истина;
Прервать;
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
ФайлЗначения = Новый Файл(Значение);
Если ФайлЗначения.Существует() И ФайлЗначения.ЭтоФайл() Тогда
ЕстьДвоичные = Истина;
Прервать;
Иначе
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение);
КонецЕсли;
КонецЕсли;
ТекущийТип = ТипЗнч(Значение);
Если ТекущийТип = Тип("Соответствие") Или ТекущийТип = Тип("Структура") Тогда
ЕстьJSON = Истина;
КонецЕсли;
КонецЦикла;
Если Не ЕстьДвоичные И Не ЕстьJSON Тогда
Метод = "GET";
Метод = "GET";
ИначеЕсли Не ЕстьДвоичные Тогда
Метод = "POST";
Иначе
Метод = "FORM";
КонецЕсли;
Возврат Метод;
КонецФункции
Функция ПолучитьОписаниеGet(Знач ТаблицаОпций)
СтруктураОписания = Новый Структура;
СтруктураОписания.Вставить("summary", "Выполнение через метод GET");
МассивПараметров = Новый Массив;
СоответствиеТипов = СоответствиеТиповSwagger();
Для Каждого Опция Из ТаблицаОпций Цикл
Ключ = Опция.Ключ;
Значение = Опция.Значение;
Описание = Опция.Описание;
СтруктураПараметра = Новый Структура;
СтруктураПараметра.Вставить("name", Ключ);
СтруктураПараметра.Вставить("in" , "query");
ТипSwagger = СоответствиеТипов.Получить(ТипЗнч(Значение));
ТипSwagger = ?(ЗначениеЗаполнено(ТипSwagger), ТипSwagger, СоответствиеТипов.Получить(Тип("Строка")));
СтруктураПараметра.Вставить("schema" , ТипSwagger);
СтруктураПараметра.Вставить("description", Описание);
МассивПараметров.Добавить(СтруктураПараметра);
КонецЦикла;
СтруктураОписания.Вставить("parameters", МассивПараметров);
Возврат СтруктураОписания;
КонецФункции
Функция ПолучитьОписаниеPost(Знач ТаблицаОпций, Знач ЕстьВариантJSON)
Описание = "Выполнение через метод POST (%1)";
Описание = СтрШаблон(Описание, ?(ЕстьВариантJSON, "JSON или form-data", "form-data"));
СтруктураОписания = Новый Структура;
СтруктураОписания.Вставить("summary", Описание);
СтруктураТела = Новый Структура;
СтруктураТела.Вставить("required", Истина);
СоответствиеВариантовТела = СформироватьВариантыТела(ТаблицаОпций, ЕстьВариантJSON);
СтруктураТела.Вставить("content", СоответствиеВариантовТела);
СтруктураОписания.Вставить("requestBody", СтруктураТела);
Возврат СтруктураОписания;
КонецФункции
Функция СформироватьВариантыТела(Знач ТаблицаОпций, Знач ЕстьВариантJSON)
СоответствиеТипов = СоответствиеТиповSwagger();
СтруктураТела = Новый Структура;
СтруктураСхемы = Новый Структура;
СтруктураСхемы.Вставить("type", "object");
СтруктураСвойств = Новый Структура;
Для Каждого Опция Из ТаблицаОпций Цикл
Ключ = Опция.Ключ;
Значение = Опция.Значение;
Описание = Опция.Описание;
СтруктураСвойства = Новый Структура;
ТипSwagger = СоответствиеТипов.Получить(ТипЗнч(Значение));
ТипSwagger = ?(ЗначениеЗаполнено(ТипSwagger), ТипSwagger, СоответствиеТипов.Получить(Тип("Строка")));
СтруктураСвойства.Вставить("type" , ТипSwagger);
СтруктураСвойства.Вставить("description", Описание);
СтруктураСвойств.Вставить(Ключ, СтруктураСвойства);
КонецЦикла;
СтруктураСхемы.Вставить("properties", СтруктураСвойств);
СтруктураТела.Вставить("schema", СтруктураСхемы);
СоответствиеВариантов = Новый Соответствие;
СоответствиеВариантов.Вставить("multipart/form-data", СтруктураТела);
Если ЕстьВариантJSON Тогда
СоответствиеВариантов.Вставить("application/json", СтруктураТела);
КонецЕсли;
Возврат СоответствиеВариантов;
КонецФункции
Функция СоответствиеТиповSwagger()
СоответствиеТипов = Новый Соответствие;
СоответствиеТипов.Вставить(Тип("Строка") , Новый Структура("type", "string"));
СоответствиеТипов.Вставить(Тип("Строка") , Новый Структура("type" , "string"));
СоответствиеТипов.Вставить(Тип("Дата") , Новый Структура("type,format", "string", "date-time"));
СоответствиеТипов.Вставить(Тип("Число") , Новый Структура("type", "number"));
СоответствиеТипов.Вставить(Тип("Булево") , Новый Структура("type", "boolean"));
СоответствиеТипов.Вставить(Тип("Массив") , Новый Структура("type,items", "array", Новый Структура("type","string")));
СоответствиеТипов.Вставить(Тип("Структура") , Новый Структура("type", "object"));
СоответствиеТипов.Вставить(Тип("Соответствие") , Новый Структура("type", "object"));
СоответствиеТипов.Вставить(Тип("ДвоичныеДанные"), Новый Структура("type", "file"));
СоответствиеТипов.Вставить(Тип("Число") , Новый Структура("type" , "number"));
СоответствиеТипов.Вставить(Тип("Булево") , Новый Структура("type" , "boolean"));
СоответствиеТипов.Вставить(Тип("Массив") , Новый Структура("type,items" , "array" , Новый Структура("type","string")));
СоответствиеТипов.Вставить(Тип("Структура") , Новый Структура("type" , "object"));
СоответствиеТипов.Вставить(Тип("Соответствие") , Новый Структура("type" , "object"));
СоответствиеТипов.Вставить(Тип("ДвоичныеДанные"), Новый Структура("type" , "file"));
Возврат СоответствиеТипов;
КонецФункции
Функция КаталогSwagger()