diff --git a/features/step_definitions/opm-build.os b/features/step_definitions/opm-build.os index 51b01a49..cc62732b 100644 --- a/features/step_definitions/opm-build.os +++ b/features/step_definitions/opm-build.os @@ -21,21 +21,21 @@ // Процедура выполняется перед запуском каждого сценария Процедура ПередЗапускомСценария(Знач Узел) Экспорт - + КонецПроцедуры // Процедура выполняется после завершения каждого сценария Процедура ПослеЗапускаСценария(Знач Узел) Экспорт - + КонецПроцедуры //Я собираю пакет во временном каталоге Процедура ЯСобираюПакетВоВременномКаталоге() Экспорт ПутьВременногоКаталога = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); - СтрокаЗапуска = СтрШаблон("opm build %1 -out %2", ТекущийКаталог(), ПутьВременногоКаталога); + СтрокаЗапуска = СтрШаблон("opm build -out %2 %1", ТекущийКаталог(), ПутьВременногоКаталога); КодВозврата = ВыполнитьКоманду(СтрокаЗапуска); - - Ожидаем.Что(КодВозврата, + + Ожидаем.Что(КодВозврата, "Ожидали, что сборка пакета (opm build) завершится с кодом возврата 0, а получили другое значение"). Равно(0); КонецПроцедуры @@ -48,7 +48,7 @@ СтрокаЗапуска = СтрШаблон("opm install -f %1 -l", ФайлСобранногоПакета.Имя); КодВозврата = ВыполнитьКоманду(СтрокаЗапуска); - + Ожидаем.Что(КодВозврата, "ВыполнитьЛокальнуюУстановкуСобранногоПакета КодВозврата").Равно(0); КонецПроцедуры @@ -71,9 +71,9 @@ ВерсияСобранногоПакета = СокрЛП(ВерсияСобранногоПакета); СообщениеОшибки = СтрШаблон("Ожидали, что установленная версия <%1> равна версии из исходников проекта"); - Если УстановленнаяВерсияПакета <> ВерсияСобранногоПакета И + Если УстановленнаяВерсияПакета <> ВерсияСобранногоПакета И Найти(УстановленнаяВерсияПакета, ВерсияСобранногоПакета) = Неопределено Тогда - + ВызватьИсключение СообщениеОшибки; КонецЕсли; @@ -83,7 +83,7 @@ Функция ВыполнитьКоманду(Знач СтрокаКоманды, ТекстВывода = "") Команда = Новый Команда; Команда.ПоказыватьВыводНемедленно(Истина); - + Команда.УстановитьСтрокуЗапуска(СтрокаКоманды); КодВозврата = Команда.Исполнить(); @@ -115,7 +115,7 @@ Ожидаем.Что(Совпадения[0].Группы.Количество(), "Количество групп должно быть 1").БольшеИлиРавно(3); ИмяСобранногоПакета = Совпадения[0].Группы[1].Значение; ВерсияПакета = Совпадения[0].Группы[2].Значение; - + БДД.СохранитьВКонтекст("ИмяСобранногоПакета", ИмяСобранногоПакета); БДД.СохранитьВКонтекст("ВерсияСобранногоПакета", ВерсияПакета); КонецПроцедуры diff --git "a/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" "b/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" index 9addcf71..bb3109d1 100644 --- "a/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" +++ "b/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" @@ -30,6 +30,15 @@ И Вывод команды "oscript" содержит "Вывод справки по параметрам" И Код возврата команды "oscript" равен 0 +Сценарий: Вызов приложения с выводом отладки в отдельный файл + + Когда Я выполняю команду "oscript" с параметрами "src/main.os version --debuglogfile ./debug.log" + # Тогда Я сообщаю вывод команды "oscript" + Тогда Вывод команды "oscript" содержит "." + И Вывод команды "oscript" не содержит "ОТЛАДКА - Подключил вывод отладочного лога в отдельный файл ./debug.log" + И Файл "debug.log" содержит "ОТЛАДКА - Подключил вывод отладочного лога в отдельный файл ./debug.log" + И Код возврата команды "oscript" равен 0 + # TODO Сценарий: Вызов приложения с предварительно включенной отладкой # проверить вывод отладочной инфы # И я включаю отладку лога с именем "oscript.app.vanessa-runner" diff --git "a/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274.feature" "b/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274.feature" index f711aa21..760daacc 100644 --- "a/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274.feature" +++ "b/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265\320\274.feature" @@ -16,31 +16,34 @@ И Я установил рабочий каталог как текущий каталог И Я сохраняю каталог проекта в контекст И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os init-dev --src ./cf --nocacheuse" - И Я очищаю параметры команды "oscript" в контексте + И Я очищаю параметры команды "oscript" в контексте Сценарий: Создание хранилища 1С - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123 --ibconnection /F./build/ib" Тогда Я сообщаю вывод команды "oscript" И каталог "build/repo" существует И Код возврата команды "oscript" равен 0 Сценарий: Создание пользователя 1С - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123" - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepouser ./build/repo admin 123 --storage-user uuu --storage-pwd 321 --storage-role Administration" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123 --ibconnection /F./build/ib" + И Код возврата команды "oscript" равен 0 + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepouser ./build/repo admin 123 --storage-user uuu --storage-pwd 321 --storage-role Administration --ibconnection /F./build/ib" Тогда Я сообщаю вывод команды "oscript" И Код возврата команды "oscript" равен 0 Сценарий: Подключение базы к хранилищу 1С - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123" - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepouser ./build/repo admin 123 --storage-user uuu --storage-pwd 321 --storage-role Administration" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123 --ibconnection /F./build/ib" + И Код возврата команды "oscript" равен 0 + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepouser ./build/repo admin 123 --storage-user uuu --storage-pwd 321 --storage-role Administration --ibconnection /F./build/ib" Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os bindrepo ./build/repo uuu 321 --ibconnection /F./build/ib" Тогда Я сообщаю вывод команды "oscript" И Код возврата команды "oscript" равен 0 Сценарий: Выгрузка конфигурации из хранилища 1С - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123" - Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os unloadcfrepo --storage-name ./build/repo --storage-user admin --storage-pwd 123 -o ./build/1cv8.cf" + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os createrepo ./build/repo admin 123 --ibconnection /F./build/ib" + И Код возврата команды "oscript" равен 0 + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os unloadcfrepo --storage-name ./build/repo --storage-user admin --storage-pwd 123 -o ./build/1cv8.cf --ibconnection /F./build/ib" Тогда Я сообщаю вывод команды "oscript" И Код возврата команды "oscript" равен 0 И Файл "./build/1cv8.cf" существует diff --git "a/features/\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.feature" "b/features/\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.feature" index 5edf9bac..3116bf59 100644 --- "a/features/\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.feature" +++ "b/features/\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.feature" @@ -8,7 +8,7 @@ Контекст: Допустим я подготовил репозиторий и рабочий каталог проекта И я подготовил рабочую базу проекта "./build/ib" по умолчанию - И Я очищаю параметры команды "oscript" в контексте + И Я очищаю параметры команды "oscript" в контексте Сценарий: Запуск разборки конфигурации из исходников в файл cf. @@ -22,10 +22,10 @@ И Код возврата команды "oscript" равен 0 Допустим Я создаю каталог "build/cf" в рабочем каталоге И Я очищаю параметры команды "oscript" в контексте - + Допустим Я добавляю параметр "<КаталогПроекта>/src/main.os decompile" для команды "oscript" И Я добавляю параметр "-i ./build/1Cv8.cf" для команды "oscript" - И Я добавляю параметр "-o ./build/cf/" для команды "oscript" + И Я добавляю параметр "-o ./build/cf" для команды "oscript" И Я добавляю параметр "--ibconnection /F./build/ib" для команды "oscript" Когда Я выполняю команду "oscript" Тогда Вывод команды "oscript" содержит @@ -44,10 +44,10 @@ | Загрузка конфигурации из файлов успешно завершена | И Код возврата команды "oscript" равен 0 И Я очищаю параметры команды "oscript" в контексте - + Допустим Я добавляю параметр "<КаталогПроекта>/src/main.os decompile --ibconnection /F./build/ib" для команды "oscript" И Я добавляю параметр "--ibconnection /F./build/ib" для команды "oscript" - И Я добавляю параметр "-o ./build/cf/" для команды "oscript" + И Я добавляю параметр "-o ./build/cf" для команды "oscript" Допустим Я создаю каталог "build/cf" в рабочем каталоге Когда Я выполняю команду "oscript" Тогда Вывод команды "oscript" содержит diff --git a/packagedef b/packagedef index 063c97e7..84ff1d2a 100644 --- a/packagedef +++ b/packagedef @@ -10,7 +10,7 @@ Если КодВозврата <> 0 Тогда ВызватьИсключение СтрШаблон("Код возврата не равен 0, а равен %1", КодВозврата); КонецЕсли; - + СобратьПакетСЛокальнымиЗависимостями(РабочийКаталог); КонецПроцедуры @@ -42,11 +42,11 @@ Описание.Имя("vanessa-runner") .Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта()) - .ВерсияСреды("1.0.20") - .ЗависитОт("logos", "1.1.1") + .ВерсияСреды("1.0.21") + .ЗависитОт("logos", "1.1.2") .ЗависитОт("cmdline", "1.0.0") .ЗависитОт("tempfiles", "0.2.2") - .ЗависитОт("asserts", "0.3.1") + .ЗависитОт("asserts", "1.2.0") .ЗависитОт("v8runner", "1.1.3") .ЗависитОт("strings", "0.4.1") .ЗависитОт("json", "1.1.0") @@ -58,7 +58,7 @@ .ЗависитОт("v8storage", "0.6.5") .ЗависитОт("v8unpack", "1.0.1") .ЗависитОт("opm", "0.14.4") - + .ВключитьФайл("tools") .ВключитьФайл("src") .ВключитьФайл("features") diff --git a/src/main.os b/src/main.os index c712b2eb..5ae3f25e 100644 --- a/src/main.os +++ b/src/main.os @@ -7,7 +7,6 @@ #Использовать cmdline #Использовать logos #Использовать 1commands -#Использовать add #Использовать "." @@ -19,15 +18,15 @@ Процедура Инициализация() Лог = Логирование.ПолучитьЛог(ПараметрыСистемы.ИмяЛогаСистемы()); - + СистемнаяИнформация = Новый СистемнаяИнформация; ПараметрыСистемы.ЭтоWindows = Найти(ВРег(СистемнаяИнформация.ВерсияОС), "WINDOWS") > 0; МенеджерКомандПриложения.РегистраторКоманд(ПараметрыСистемы); - + КонецПроцедуры -Функция СоответствиеПеременныхОкруженияПараметрамКоманд() +Функция СоответствиеПеременныхОкруженияПараметрамКоманд() СоответствиеПеременных = Новый Соответствие(); СоответствиеПеременных.Вставить("RUNNER_IBCONNECTION", "--ibconnection"); @@ -50,7 +49,7 @@ СоответствиеПеременных.Вставить("RUNNER_NOCACHEUSE", "--nocacheuse"); СоответствиеПеременных.Вставить("RUNNER_LOCALE", "--locale"); СоответствиеПеременных.Вставить("RUNNER_LANGUAGE", "--language"); - + Возврат Новый ФиксированноеСоответствие(СоответствиеПеременных); КонецФункции @@ -73,61 +72,63 @@ КонецФункции // УстановитьКаталогТекущегоПроекта() Функция ПолучитьПарсерКоманднойСтроки() - + Парсер = Новый ПарсерАргументовКоманднойСтроки(); МенеджерКомандПриложения.ЗарегистрироватьКоманды(Парсер); - + Возврат Парсер; - + КонецФункции // ПолучитьПарсерКоманднойСтроки Функция ВыполнениеКоманды() - + ПараметрыЗапуска = РазобратьАргументыКоманднойСтроки(); - + Если ПараметрыЗапуска = Неопределено ИЛИ ПараметрыЗапуска.Количество() = 0 Тогда - + ВывестиВерсию(); Лог.Ошибка("Некорректные аргументы командной строки"); МенеджерКомандПриложения.ПоказатьСправкуПоКомандам(); Возврат МенеджерКомандПриложения.РезультатыКоманд().ОшибкаВремениВыполнения; - + КонецЕсли; - + Команда = ""; ЗначенияПараметров = Неопределено; - + Если ТипЗнч(ПараметрыЗапуска) = Тип("Структура") Тогда - + // это команда Команда = ПараметрыЗапуска.Команда; ЗначенияПараметров = ПараметрыЗапуска.ЗначенияПараметров; Лог.Отладка("Выполняю команду продукта %1", Команда); - + ИначеЕсли ЗначениеЗаполнено(ПараметрыСистемы.ИмяКомандыПоУмолчанию()) Тогда - + // это команда по-умолчанию Команда = ПараметрыСистемы.ИмяКомандыПоУмолчанию(); ЗначенияПараметров = ПараметрыЗапуска; Лог.Отладка("Выполняю команду продукта по умолчанию %1", Команда); - + Иначе - + ВызватьИсключение "Некорректно настроено имя команды по-умолчанию."; - + КонецЕсли; - + Если Команда <> ПараметрыСистемы.ИмяКомандыВерсия() Тогда ВывестиВерсию(); КонецЕсли; ДополнитьЗначенияПараметров(Команда, ЗначенияПараметров); - + + ВключитьВыводОтладочногоЛогаВОтдельныйФайл(ЗначенияПараметров); + Возврат МенеджерКомандПриложения.ВыполнитьКоманду(Команда, ЗначенияПараметров); - + КонецФункции // ВыполнениеКоманды() Процедура ДополнитьЗначенияПараметров(Знач Команда, ЗначенияПараметров) @@ -143,22 +144,22 @@ ЗначениеПараметраФайлНастроек = ЗначенияПараметров["--settings"]; Если ЗначениеЗаполнено(ЗначениеПараметраФайлНастроек) Тогда ФайлОбщихНастроек = Новый Файл(ОбщиеМетоды.ПолныйПуть(ЗначениеПараметраФайлНастроек)); - Ожидаем.Что(ФайлОбщихНастроек.Существует(), + Ожидаем.Что(ФайлОбщихНастроек.Существует(), СтрШаблон("Ожидаем, что указанный в --settings <%1> файл по пути <%2> существует, а его нет!", ЗначениеПараметраФайлНастроек, ФайлОбщихНастроек.ПолноеИмя) ).ЭтоИстина(); КонецЕсли; - - НастройкиИзФайла = ОбщиеМетоды.ПрочитатьНастройкиФайлJSON(ТекущийКаталогПроекта, + + НастройкиИзФайла = ОбщиеМетоды.ПрочитатьНастройкиФайлJSON(ТекущийКаталогПроекта, ЗначениеПараметраФайлНастроек, ПутьКФайлуНастроекПоУмолчанию); ЗначенияПараметровНизкийПриоритет = Новый Соответствие; - Если НастройкиИзФайла.Количество() > 0 Тогда + Если НастройкиИзФайла.Количество() > 0 Тогда ОбщиеМетоды.ДополнитьАргументыИзФайлаНастроек(Команда, ЗначенияПараметровНизкийПриоритет, НастройкиИзФайла); КонецЕсли; - + СоответствиеПеременных = СоответствиеПеременныхОкруженияПараметрамКоманд(); ОбщиеМетоды.ЗаполнитьЗначенияИзПеременныхОкружения(ЗначенияПараметровНизкийПриоритет, СоответствиеПеременных); @@ -171,11 +172,12 @@ ДобавитьДанныеПодключения(ЗначенияПараметров); НастройкиДля1С.ДобавитьШаблоннуюПеременную("workspaceRoot", ЗначениеПараметра_КаталогПроекта(ЗначенияПараметров)); - НастройкиДля1С.ДобавитьШаблоннуюПеременную("addRoot", add.КаталогИнструментов()); НастройкиДля1С.ДобавитьШаблоннуюПеременную("runnerRoot", ОбщиеМетоды.КаталогПроекта()); - + НастройкиДля1С.ЗаменитьШаблонныеПеременныеВКоллекции(ЗначенияПараметров); + ПроверитьНаличиеСлешаКакПоследнегоСимволаВПараметрах(ЗначенияПараметров); + КонецПроцедуры //ДополнитьЗначенияПараметров Процедура ДобавитьДанныеПодключения(ЗначенияПараметров) @@ -197,15 +199,15 @@ Лог.Предупреждение("------------------------------------------------------------------"); КонецЕсли; КонецЕсли; - + Если ЗначениеЗаполнено(ЗначенияПараметров["--ibname"]) Тогда - ЗначенияПараметров.Вставить("--ibname", + ЗначенияПараметров.Вставить("--ibname", ОбщиеМетоды.ПереопределитьПолныйПутьВСтрокеПодключения(ЗначенияПараметров["--ibname"])); ИсходнаяСтрокаПодключения = ЗначенияПараметров["--ibname"]; НоваяСтрокаПодключения = МенеджерСпискаБаз.ПолучитьСтрокуПодключенияСКэшем( - ИсходнаяСтрокаПодключения, + ИсходнаяСтрокаПодключения, ЗначенияПараметров["--nocacheuse"]); ЗначенияПараметров.Вставить("--ibname", НоваяСтрокаПодключения); @@ -219,13 +221,13 @@ Функция ДанныеПодключения(ЗначенияПараметров) СтруктураПодключения = Новый Структура; - + // здесь может находиться и имя базы и строка подключения СтруктураПодключения.Вставить("СтрокаПодключения", ЗначенияПараметров["--ibname"]); - + // здесь может находиться только строка подключения в виде пути к базе - СтруктураПодключения.Вставить("ПутьБазы", ЗначенияПараметров["--ibconnection"]); - + СтруктураПодключения.Вставить("ПутьБазы", ЗначенияПараметров["--ibconnection"]); + СтруктураПодключения.Вставить("Пользователь", ЗначенияПараметров["--db-user"]); СтруктураПодключения.Вставить("Пароль", ЗначенияПараметров["--db-pwd"]); СтруктураПодключения.Вставить("КодЯзыка", ЗначенияПараметров["--language"]); @@ -254,17 +256,59 @@ Возврат Рез; КонецФункции +Процедура ПроверитьНаличиеСлешаКакПоследнегоСимволаВПараметрах(ЗначенияПараметров) + Если Не ПараметрыСистемы.ЭтоWindows Тогда + Возврат; + КонецЕсли; + РегулярноеВыражение = Новый РегулярноеВыражение("[\\\/]\s*$"); + РегулярноеВыражение.Многострочный = Истина; + Для каждого КлючЗначение Из ЗначенияПараметров Цикл + Значение = КлючЗначение.Значение; + Если ЗначениеЗаполнено(Значение) И РегулярноеВыражение.Совпадает(Значение) Тогда + ВызватьИсключение СтрШаблон( + "Запрещено использование слешей как последних символов в параметрах.%1" + + " Это может привести к проблемам при запуске в командной строке.%1%1 Ключ %2 = %3", + Символы.ПС, КлючЗначение.Ключ, Значение); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Процедура ВключитьВыводОтладочногоЛогаВОтдельныйФайл(Знач ЗначенияПараметров) + ПутьФайлаВывода = ""; + Если ЗначенияПараметров["--debuglogfile"] <> Неопределено Тогда + ПутьФайлаВывода = ЗначенияПараметров["--debuglogfile"]; + ИначеЕсли ЗначенияПараметров["--debuglog"] <> Неопределено Тогда + ПутьФайлаВывода = ПолучитьИмяВременногоФайла(".log"); + ФайлВывода = Новый Файл(ПутьФайлаВывода); + ПутьФайлаВывода = ОбъединитьПути(ФайлВывода.Путь, "vrunner-" + ФайлВывода.Имя); + Иначе + Возврат; + КонецЕсли; + + ФайлЖурнала = Новый ВыводЛогаВФайл; + ФайлЖурнала.ОткрытьФайл(ПутьФайлаВывода); + + Если Не Лог.ДобавленыСобственныеСпособыВывода() Тогда + ВыводПоУмолчанию = Новый ВыводЛогаВКонсоль(); + Лог.ДобавитьСпособВывода(ВыводПоУмолчанию); + КонецЕсли; + + Лог.ДобавитьСпособВывода(ФайлЖурнала, УровниЛога.Отладка); + + Лог.Отладка("Подключил вывод отладочного лога в отдельный файл %1", ПутьФайлаВывода); +КонецПроцедуры + Процедура ВывестиВерсию() - + Сообщить(СтрШаблон("%1 v%2", ПараметрыСистемы.ИмяПродукта(), ПараметрыСистемы.ВерсияПродукта())); - + КонецПроцедуры // ВывестиВерсию() Функция РазобратьАргументыКоманднойСтроки() - + Парсер = ПолучитьПарсерКоманднойСтроки(); Возврат Парсер.Разобрать(АргументыКоманднойСтроки); - + КонецФункции // РазобратьАргументыКоманднойСтроки Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт @@ -278,18 +322,18 @@ Инициализация(); Попытка - + КодВозврата = ВыполнениеКоманды(); - + ВременныеФайлы.Удалить(); - + ЗавершитьРаботу(КодВозврата); - + Исключение - + Лог.КритичнаяОшибка(ОписаниеОшибки()); ВременныеФайлы.Удалить(); ЗавершитьРаботу(МенеджерКомандПриложения.РезультатыКоманд().ОшибкаВремениВыполнения); - + КонецПопытки; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" index f39912ce..d8874b48 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров +// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды // diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" index 70646ee2..72159a2c 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров +// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды // diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" index 4c15612e..01e6cdbd 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров +// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды // diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" index 2be4338f..b5137764 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров +// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды // @@ -28,7 +28,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров + " Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" index 5cf55c33..9d68d080 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" @@ -230,8 +230,11 @@ Сообщить(ОписаниеОшибки()); КонецПопытки; РезультатСообщение = ОбщиеМетоды.ПрочитатьФайлИнформации(Конфигуратор.ФайлИнформации()); - Если СтрНайти(РезультатСообщение, "успешно завершено") = 0 Тогда + Если НЕ (СтрНайти(РезультатСообщение, "успешно завершено") = 0 + ИЛИ СтрНайти(РезультатСообщение, "completed successfully") = 0) Тогда + ВызватьИсключение "Результат работы не успешен: " + Символы.ПС + РезультатСообщение; + КонецЕсли; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\232\320\276\320\277\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\232\320\276\320\277\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" new file mode 100644 index 00000000..27cd4031 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\232\320\276\320\277\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Подключение ИБ к хранилищу конфигурации 1С. +// +// TODO добавить фичи для проверки команды +// +// Служебный модуль с набором методов работы с командами приложения +// +// Структура модуля реализована в соответствии с рекомендациями +// oscript-app-template (C) EvilBeaver +// +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#Использовать logos + +Перем Лог; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт + + ТекстОписания = + " Копирование пользователей хранилища из другого хранилища. + | "; + + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, + ТекстОписания); + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьПодключаемогоХранилища", + "Строка подключения к хранилищу + | (возможно указание как файлового пути, так и пути через http или tcp)"); +Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьПодключаемогоХранилищаДляКопирования", + "Строка подключения к хранилищу для копирования пользователей + | (возможно указание как файлового пути, так и пути через http или tcp)"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища. + | Обязательный параметр"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль. + | Обязательный параметр"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user-copy", "Пользователь хранилища. + | Обязательный параметр"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd-copy", "Пароль. + | Обязательный параметр"); + + Парсер.ДобавитьКоманду(ОписаниеКоманды); + +КонецПроцедуры // ЗарегистрироватьКоманду + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// ДополнительныеПараметры - Соответствие - дополнительные параметры (необязательно) +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач ДополнительныеПараметры = Неопределено) Экспорт + + Лог = ДополнительныеПараметры.Лог; + + ПутьКХранилищу = ПараметрыКоманды["ПутьПодключаемогоХранилища"]; + ЛогинПользователя = ПараметрыКоманды["--storage-user"]; + ПарольПользователя = ПараметрыКоманды["--storage-pwd"]; + ПутьКХранилищуКопии = ПараметрыКоманды["ПутьПодключаемогоХранилищаДляКопирования"]; + ЛогинПользователяКопии = ПараметрыКоманды["--storage-user-copy"]; + ПарольПользователяКопии = ПараметрыКоманды["--storage-pwd-copy"]; + + Ожидаем.Что(ПутьКХранилищу, " не задан путь к хранилищу").Заполнено(); + Ожидаем.Что(ЛогинПользователя, " не задан логин пользователя хранилища").Заполнено(); + Ожидаем.Что(ПарольПользователя, " не задан пароль пользователя хранилища").Заполнено(); + Ожидаем.Что(ПутьКХранилищуКопии, " не задан путь к хранилищу для копирования").Заполнено(); + Ожидаем.Что(ЛогинПользователяКопии, " не задан логин пользователя хранилища для копирования").Заполнено(); + Ожидаем.Что(ПарольПользователяКопии, " не задан пароль пользователя хранилища для копирования").Заполнено(); + + ДанныеПодключения = ПараметрыКоманды["ДанныеПодключения"]; + СтрокаПодключения = ДанныеПодключения.СтрокаПодключения; + Если Не ЗначениеЗаполнено(СтрокаПодключения) Тогда + СтрокаПодключения = "/F"; + КонецЕсли; + + МенеджерКонфигуратора = Новый МенеджерКонфигуратора; + + МенеджерКонфигуратора.Инициализация( + СтрокаПодключения, + ДанныеПодключения.Пользователь, + ДанныеПодключения.Пароль, + ПараметрыКоманды["--v8version"], + ПараметрыКоманды["--uccode"], + ДанныеПодключения.КодЯзыка); + + Попытка + МенеджерКонфигуратора.КопироватьПользователейИзХранилища( + ПутьКХранилищу, + ЛогинПользователя, + ПарольПользователя, + ПутьКХранилищуКопии, + ЛогинПользователяКопии, + ПарольПользователяКопии); + Исключение + МенеджерКонфигуратора.Деструктор(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + МенеджерКонфигуратора.Деструктор(); + + Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех; +КонецФункции // ВыполнитьКоманду diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 6cf607d1..a161c579 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -21,7 +21,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Объединить cf-файл в конфигурацией из базы. + " Объединить cf-файл c конфигурацией из инф.базы. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" new file mode 100644 index 00000000..523239f0 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" @@ -0,0 +1,885 @@ +#Использовать fs +#Использовать 1commands +#Использовать tempfiles +#Использовать json + +Перем Лог; +Перем ПарсерJSON; + +Перем РабочаяОбласть; +Перем СписокПапокСПроектами; +Перем СписокИменПроектов; +Перем ВерсияEDT; + +Перем КаталогОтчетов; +Перем ПутьКФайламПроекта; + +Перем ИмяФайлаРезультата; +Перем УдалятьФайлРезультата; +Перем ИмяПредыдущегоФайлаРезультата; +Перем ИсключенияВОшибках; +Перем ПропускиВОшибках; + +Перем кэш; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт + + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Проверка проекта EDT"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--allure-results", + "Путь к каталогу результатов Allure"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--exception-file", + "Путь файла с указанием пропускаемых ошибок. Необязательный аргумент. + | Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть + | Кодировка: UTF-8"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--validation-result", + "Путь к файлу, в который будут записаны результаты проверки проекта. Необязательный аргумент."); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--prev-validation-result", + "Путь к файлу с предыдущими результатами проверки проекта. Необязательный аргумент. + | Если заполнен, то результат будет записан как разность новых ошибок и старых. + | Ошибки и предупреждения, которые есть в предыдущем файле, но которых нет в новом - будут помечены как passed (Исправлено). + | Ошибки и предупреждения, которые есть только в новом файле результатов - будут помечены как failed (Ошибки) и broken (Предупреждения). + | Все остальные ошибки и предупреждения, которые есть в обоих файлах, будут помечены как skipped (Пропущено)."); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--project-url", + "Путь к файлам проекта. Необязательный аргумент. + | Если заполнен, то в отчетах аллюр будут ссылки на конкретные строки с ошибками. + | Пример: --project-url https://github.com/1C-Company/GitConverter/tree/master/GitConverter/src "); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--EDTversion", + "Используемая версия EDT. Необязательный аргумент. + | Необходима, если зарегистрировано одновременно несколько версий. + | Узнать доступные версии можно командой ""ring help"" + | Пример: --EDTversion 1.9.1"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace-location", + "Расположение рабочей области. Необязательный аргумент. + | Если не указан, то проверка выполнятся не будет. Актуально для создания отчетов по существующему файлу результатов."); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--project-list", + "Список папок, откуда загрузить проекты в формате EDT для проверки. Необязательный аргумент. + | Одновременно можно использовать только один агрумент: project-list или project-name-list"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--project-name-list", + "Список имен проектов в текущей рабочей области, откуда загрузить проекты в формате EDT для проверки. Необязательный аргумент. + | Одновременно можно использовать только один агрумент: project-list или project-name-list. + | + | Примеры выполнения: + | vanessa-runner edt-validate --project-list D:/project-1 D:/project-2 --workspace-location D:/workspace + | runner edt-validate --allure-results ""D:/allure-results/"" ^ + | --workspace-location ""D:/workspace"" ^ + | --project-list ""D:/GIT_Repo/GitConverter/"" ^ + | --exception-file ""D:/WORKDIR%excp.txt"" ^ + | --validation-result ""D:/validation-result.txt"" ^ + | --prev-validation-result ""D:/validation-result.txt"" ^ + | --project-url https://github.com/1C-Company/GitConverter/tree/master/GitConverter/src + | + | ВНИМАНИЕ! Параметры, которые перечислены далее, не используются. + | + |"); + + Парсер.ДобавитьКоманду(ОписаниеКоманды); + +КонецПроцедуры + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// ДополнительныеПараметры - Соответствие - (необязательно) дополнительные параметры +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач ДополнительныеПараметры = Неопределено) Экспорт + + Лог = ДополнительныеПараметры.Лог; + + ИнициализацияПараметров( ПараметрыКоманды ); + + Если ЗначениеЗаполнено( ИмяПредыдущегоФайлаРезультата ) Тогда + + тзРезультатПред = ПрочитатьТаблицуИзФайлаРезультата( ИмяПредыдущегоФайлаРезультата ); + + КонецЕсли; + + Успешно = ВыполнитьПроверкуEDT(); + + тзРезультат = ПрочитатьТаблицуИзФайлаРезультата( ИмяФайлаРезультата ); + + УдалитьФайлРезультатовПриНеобходимости(); + + Если ЗначениеЗаполнено( ИмяПредыдущегоФайлаРезультата ) Тогда + + тзРезультат = РазностнаяТаблицаРезультатов( тзРезультатПред, тзРезультат ); + + КонецЕсли; + + СоздатьФайлыПоТаблицеПроверки(тзРезультат); + + РезультатыКоманд = МенеджерКомандПриложения.РезультатыКоманд(); + + Возврат ?(Успешно, РезультатыКоманд.Успех, РезультатыКоманд.ОшибкаВремениВыполнения); + +КонецФункции + +// { приватная часть + +Процедура ИнициализацияПараметров( Знач ПараметрыКоманды ) + + Лог.Отладка("Чтение параметров"); + + КаталогОтчетов = ПараметрыКоманды["--allure-results"]; + + Если КаталогОтчетов = Неопределено Тогда + + КаталогОтчетов = ""; + Лог.Отладка(" Каталог отчетов (--allure-results) не задан."); + + Иначе + + Лог.Отладка(" Каталог отчетов (--allure-results): %1", КаталогОтчетов); + + КонецЕсли; + + ВерсияEDT = ПараметрыКоманды["--EDTversion"]; + РабочаяОбласть = ПараметрыКоманды["--workspace-location"]; + СписокПапокСПроектами = ПараметрыКоманды["--project-list"]; + СписокИменПроектов = ПараметрыКоманды["--project-name-list"]; + ПутьКФайламПроекта = ПараметрыКоманды["--project-url"]; + + Лог.Отладка(" Версия EDT (--EDTversion): %1", Строка( ВерсияEDT ) ); + Лог.Отладка(" Рабочая область (--workspace-location): %1", Строка( РабочаяОбласть ) ); + Лог.Отладка(" Список папок с проектами (--project-list): %1", Строка( СписокПапокСПроектами ) ); + Лог.Отладка(" Список имен проектов (--project-name-list): %1", Строка( СписокИменПроектов ) ); + Лог.Отладка(" Путь к файлам проекта (--project-url): %1", Строка( ПутьКФайламПроекта ) ); + + ИмяФайлаРезультата = ПараметрыКоманды["--validation-result"]; + УдалятьФайлРезультата = Ложь; + + Если ИмяФайлаРезультата = Неопределено Тогда + + ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("out"); + УдалятьФайлРезультата = Истина; + Лог.Отладка(" Файл результата не задан (--validation-result). Будет использован временный файл."); + + КонецЕсли; + + Лог.Отладка(" Файл результата (--validation-result): %1", ИмяФайлаРезультата); + + ИмяПредыдущегоФайлаРезультата = ПараметрыКоманды["--prev-validation-result"]; + + Лог.Отладка(" Файл предыдущего результата (--prev-validation-result): %1", Строка( ИмяПредыдущегоФайлаРезультата )); + + ИсключенияВОшибках = ИсключаемыеОшибки(); + ПропускиВОшибках = СодержимоеФайлаПропускаемыхОшибок( ПараметрыКоманды["--exception-file"] ); + + ПарсерJSON = Новый ПарсерJSON(); + +КонецПроцедуры + +Функция ВыполнитьПроверкуEDT() + + Если Не ЗначениеЗаполнено( РабочаяОбласть ) Тогда + + Лог.Информация( "Рабочая область (--workspace-location) не указана. Проверка проекта пропущена." ); + + Возврат Истина; + + КонецЕсли; + + Если Не ЗначениеЗаполнено( СписокПапокСПроектами ) + И Не ЗначениеЗаполнено( СписокИменПроектов ) Тогда + + Лог.Информация( "Проекты к проверке (--project-list или project-name-list) не указаны. Проверка проекта пропущена." ); + + Возврат Истина; + + КонецЕсли; + + Попытка + + // Для EDT критично, чтобы файла не существовало + ОбщиеМетоды.УдалитьФайлЕслиОнСуществует( ИмяФайлаРезультата ); + + Команда = Новый Команда; + + Если ЗначениеЗаполнено( ВерсияEDT ) Тогда + + строкаЗапуска = СтрШаблон( "ring edt@%1 workspace validate", ВерсияEDT ); + + Иначе + + строкаЗапуска = "ring edt workspace validate"; + + КонецЕсли; + + Команда.УстановитьСтрокуЗапуска( строкаЗапуска ); + Команда.УстановитьКодировкуВывода( КодировкаТекста.ANSI ); + Команда.ДобавитьПараметр( "--workspace-location " + ОбщиеМетоды.ОбернутьПутьВКавычки( РабочаяОбласть ) ); + Команда.ДобавитьПараметр( "--file " + ОбщиеМетоды.ОбернутьПутьВКавычки( ИмяФайлаРезультата ) ); + + Если ЗначениеЗаполнено( СписокПапокСПроектами ) Тогда + Команда.ДобавитьПараметр("--project-list " + ОбщиеМетоды.ОбернутьПутьВКавычки( СписокПапокСПроектами ) ); + КонецЕсли; + + Если ЗначениеЗаполнено( СписокИменПроектов ) Тогда + Команда.ДобавитьПараметр("--project-name-list " + ОбщиеМетоды.ОбернутьПутьВКавычки( СписокИменПроектов ) ); + КонецЕсли; + + Лог.Информация( "Начало проверки EDT-проекта" ); + началоЗамера = ТекущаяДата(); + + КодВозврата = Команда.Исполнить(); + + Лог.Информация( "Проверка EDT-проекта завершена за %1с", Окр( ТекущаяДата() - началоЗамера ) ); + + Исключение + + УдалитьФайлРезультатовПриНеобходимости(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + КонецПопытки; + + Возврат КодВозврата = 0; + +КонецФункции + +Процедура УдалитьФайлРезультатовПриНеобходимости() + + Если УдалятьФайлРезультата Тогда + + ОбщиеМетоды.УдалитьФайлЕслиОнСуществует(ИмяФайлаРезультата); + + КонецЕсли; + +КонецПроцедуры + +Функция СодержимоеФайлаПропускаемыхОшибок( Знач ИмяФайлаПропускаемыхОшибок ) + + Результат = Новый Массив; + + Если Не ЗначениеЗаполнено( ИмяФайлаПропускаемыхОшибок ) Тогда + Лог.Информация( "Файл пропускаемых ошибок (--exception-file) не указан. Пропуски не используются." ); + Возврат Результат; + КонецЕсли; + + Файл = Новый Файл( ИмяФайлаПропускаемыхОшибок ); + Если Не Файл.Существует() Тогда + + // Отсутствие этого файла не критично, поэтому обойдемся без исключений + + Лог.Предупреждение( "Файл пропускаемых ошибок (--exception-file) %1 не найден.", ИмяФайлаПропускаемыхОшибок ); + + Возврат Результат; + + КонецЕсли; + + Лог.Отладка( "Чтение файла пропускаемых ошибок из %1", ИмяФайлаПропускаемыхОшибок ); + + ЧтениеТекста = Новый ЧтениеТекста( ИмяФайлаПропускаемыхОшибок, КодировкаТекста.UTF8 ); + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + Пока ПрочитаннаяСтрока <> Неопределено Цикл + Если Не ПустаяСтрока(ПрочитаннаяСтрока) Тогда + пропуск = СокрЛП(НРег(ПрочитаннаяСтрока)); + Результат.Добавить(пропуск); + Лог.Отладка("Добавлено в пропуски: %1", пропуск); + КонецЕсли; + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + КонецЦикла; + + ЧтениеТекста.Закрыть(); + + Лог.Отладка("Прочитано пропусков: %1", Результат.Количество()); + + Возврат Результат; + +КонецФункции + +Функция ИсключаемыеОшибки() + + // Определяем строки для исключения из ошибок + // См. стандарт "Обработчики событий модуля формы, подключаемые из кода" + // https://its.1c.ru/db/v8std#content:-2145783155:hdoc + МассивСтрокИсключений = Новый Массив(); + МассивСтрокИсключений.Добавить(Нрег("Неиспользуемый метод ""Подключаемый_")); + МассивСтрокИсключений.Добавить(Нрег("Пустой обработчик: ""Подключаемый_")); + + Возврат МассивСтрокИсключений; + +КонецФункции + + +// Создание таблицы результата +Функция ПрочитатьТаблицуИзФайлаРезультата( Знач пПутьКФайлу ) + + Лог.Отладка( "Чтение файла результата %1", пПутьКФайлу ); + + тз = Новый ТаблицаЗначений; + тз.Колонки.Добавить( "ДатаОбнаружения" ); + тз.Колонки.Добавить( "Тип" ); + тз.Колонки.Добавить( "Проект" ); + тз.Колонки.Добавить( "Метаданные" ); + тз.Колонки.Добавить( "Положение" ); + тз.Колонки.Добавить( "Описание" ); + + Файл = Новый Файл( пПутьКФайлу ); + Если Не Файл.Существует() Тогда + + // Файла может не быть если + // 1) Это первый запуск получение разностной таблицы + // 2) Нет ошибок (EDT просто не создает файл результата) + // 3) EDT вернул ошибку + // 4) Проверка EDT не запускалась, выполняется только построение отчета Аллюр + // По пунктам 1-3 стоит вернуть пустую таблицу, + // по 4 не все так однозначно, но если и вызывать исключение, то при инициализации параметров + + Лог.Информация( "Файл отчета об ошибках %1 не найден.", пПутьКФайлу ); + + Возврат тз; + + КонецЕсли; + + + ЧтениеТекста = Новый ЧтениеТекста( пПутьКФайлу, КодировкаТекста.UTF8 ); + + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + + Пока Не ПрочитаннаяСтрока = Неопределено Цикл + + Если ПустаяСтрока( ПрочитаннаяСтрока ) Тогда + + Продолжить; + + КонецЕсли; + + Если СтрокаВходитВМассив( ПрочитаннаяСтрока, ИсключенияВОшибках ) Тогда + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + Продолжить; + КонецЕсли; + + компонентыСтроки = СтрРазделить( ПрочитаннаяСтрока, " " ); + + новСтрока = тз.Добавить(); + + Для ц = 0 По 4 Цикл + + новСтрока[ц] = компонентыСтроки[ц]; + + КонецЦикла; + + // В описании могут быть и табы, по которым делим + + Для ц = 5 По компонентыСтроки.ВГраница() Цикл + + Если ЗначениеЗаполнено( новСтрока.Описание ) Тогда + + новСтрока.Описание = новСтрока.Описание + " "; + + Иначе + + новСтрока.Описание = ""; + + КонецЕсли; + + новСтрока.Описание = новСтрока.Описание + компонентыСтроки[ц]; + + КонецЦикла; + + Если СтрокаВходитВМассив( ПрочитаннаяСтрока, ПропускиВОшибках ) Тогда + + новСтрока.Тип = ТипОшибки_Пропущено(); + + КонецЕсли; + + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + + КонецЦикла; + + ЧтениеТекста.Закрыть(); + + Лог.Отладка("Из файла %1 прочитано %2 строк", пПутьКФайлу, тз.Количество()); + + Возврат тз; + +КонецФункции + +//Проверяет вхождение строк из массива в проверямой строке. +//Параметры: +// ПроверяемаяСтрока - Строка - строка для проверки. +// МассивСтрокИсключений - Массив - массив строк, для проверки. +// +//Возвращаемое значение: +// Булево - Истина, в проверяемой строке содежрится один из элементов массив. +// Ложь, не нашли +Функция СтрокаВходитВМассив( Знач ПроверяемаяСтрока, Знач МассивСтрокИсключений ) + + Для Каждого СтрИсключения Из МассивСтрокИсключений Цикл + + Если СтрНайти(Нрег(ПроверяемаяСтрока), СтрИсключения) > 0 Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция РазностнаяТаблицаРезультатов( Знач пТЗ_пред, Знач пТЗ_нов ) + + тз_стар = пТЗ_пред.Скопировать(); + тз_стар.Колонки.Добавить("Изменение"); + тз_стар.ЗаполнитьЗначения(1, "Изменение" ); + + тз = пТЗ_нов.Скопировать(); + тз.Колонки.Добавить("Изменение"); + тз.ЗаполнитьЗначения( - 1, "Изменение" ); + + Для Каждого цСтрока Из тз_стар Цикл + + ЗаполнитьЗначенияСвойств( тз.Добавить(), цСтрока ); + + КонецЦикла; + + тз.Свернуть( "Тип,Проект,Метаданные,Положение,Описание" , "Изменение" ); + + Для Каждого цСтрока Из тз Цикл + + Если цСтрока.Изменение = 0 Тогда + + // есть и в старой и в новой таблице + цСтрока.Тип = ТипОшибки_Пропущено(); + + ИначеЕсли цСтрока.Изменение > 0 Тогда + + // есть только в старой + цСтрока.Тип = ТипОшибки_Исправлено(); + + Иначе + + // Внесли новую ошибку + + КонецЕсли; + + КонецЦикла; + + Возврат тз; + +КонецФункции + +Функция ТипОшибки_Пропущено() + Возврат "Пропущено"; +КонецФункции + +Функция ТипОшибки_Исправлено() + Возврат "Исправлено"; +КонецФункции + +// Создание файлов для отчета Allure + +Процедура СоздатьФайлыПоТаблицеПроверки(Знач пТаблицаПроверки) + + Если Не ЗначениеЗаполнено( КаталогОтчетов ) Тогда + + Лог.Отладка("Каталог отчетов (--allure-results) не указан. Создание отчета Allure пропущено."); + + Возврат; + + КонецЕсли; + + началоЗамера = ТекущаяДата(); + + Лог.Отладка("Создание файлов в каталоге %1.", КаталогОтчетов); + Лог.Отладка(" Очистка каталога %1.", КаталогОтчетов); + + УдалитьФайлы( КаталогОтчетов, "*.json" ); + + Лог.Отладка(" Создание файлов json по таблице проверки в каталоге %1.", КаталогОтчетов); + + количествоСозданныхФайлов = 0; + + Для Каждого цСтрока Из пТаблицаПроверки Цикл + + СтруктураВыгрузки = ПолучитьОписаниеСценарияАллюр2(); + СтруктураВыгрузки.name = цСтрока.Метаданные + ". " + цСтрока.Положение + ": " + цСтрока.Описание; + СтруктураВыгрузки.fullName = СтруктураВыгрузки.name; + СтруктураВыгрузки.historyId = цСтрока.Метаданные + ". " + цСтрока.Положение + ": " + цСтрока.Описание; + СтруктураВыгрузки.Вставить( "description", цСтрока.Описание ); + + Если цСтрока.Тип = "Ошибка" Тогда + + СтруктураВыгрузки.status = "failed"; + + ИначеЕсли цСтрока.Тип = "Предупреждение" Тогда + + СтруктураВыгрузки.status = "broken"; + + ИначеЕсли цСтрока.Тип = "Пропущено" Тогда + + СтруктураВыгрузки.status = "skipped"; + + ИначеЕсли цСтрока.Тип = "Исправлено" Тогда + + СтруктураВыгрузки.status = "passed"; + + КонецЕсли; + + структ = Новый Структура( "name,value", "package", цСтрока.Метаданные ); + СтруктураВыгрузки.labels.Добавить( структ ); + + Для Каждого цКонтекст Из ПолучитьКонтексты( цСтрока.Описание ) Цикл + + структ = Новый Структура( "name,value", "tag", цКонтекст ); + СтруктураВыгрузки.labels.Добавить( структ ); + + КонецЦикла; + + структ = Новый Структура( "name,value", "story", ОписаниеФункциональности( цСтрока.Описание ) ); + СтруктураВыгрузки.labels.Добавить( структ ); + + ссылкаНаСтроку = ПолучитьСсылкуНаСтроку( цСтрока.Метаданные, цСтрока.Положение ); + + Если ЗначениеЗаполнено( ссылкаНаСтроку ) Тогда + + ОписаниеСсылки = Новый Структура("name,url,type"); + ОписаниеСсылки.name = "Перейти на строку с ошибкой"; + ОписаниеСсылки.url = ссылкаНаСтроку; + ОписаниеСсылки.type = ""; + + СтруктураВыгрузки.links.Добавить( ОписаниеСсылки ); + + КонецЕсли; + + РеальноеИмяФайла = ОбъединитьПути( КаталогОтчетов, "" + СтруктураВыгрузки.uuid + "-result.json" ); + + ЗаписатьФайлJSON( РеальноеИмяФайла, СтруктураВыгрузки); + + количествоСозданныхФайлов = количествоСозданныхФайлов + 1; + + КонецЦикла; + + лог.Отладка( " Созданы файлы отчетов (%1) в каталоге %2 за %3с", количествоСозданныхФайлов, КаталогОтчетов, Окр( ТекущаяДата() - началоЗамера )); + + СоздатьФайлКатегорий(); + +КонецПроцедуры + +Процедура СоздатьФайлКатегорий() + + имяФайлаКатегорий = ОбъединитьПути( КаталогОтчетов, "categories.json" ); + + Лог.Отладка(" Создание файла категорий %1.", имяФайлаКатегорий); + + категории = Новый Массив; + + категории.Добавить( ОписаниеКатегории( "Ошибка", "failed" ) ); + категории.Добавить( ОписаниеКатегории( "Предупреждение", "broken" ) ); + категории.Добавить( ОписаниеКатегории( "Пропущено", "skipped" ) ); + категории.Добавить( ОписаниеКатегории( "Исправлено", "passed" ) ); + + ЗаписатьФайлJSON( имяФайлаКатегорий, категории); + +КонецПроцедуры + +Функция ОписаниеКатегории( Знач пНаименование, Знач пСтатус ) + + массивСтатусов = Новый Массив; + массивСтатусов.Добавить( пСтатус ); + Возврат Новый Структура( "name,matchedStatuses", пНаименование, массивСтатусов ); + +КонецФункции + +Функция ПолучитьКонтексты( Знач пОписание ) + + начало = СтрНайти( пОписание, "[" ); + конец = СтрНайти( пОписание, "]", НаправлениеПоиска.СКонца ); + + Если начало < конец + И конец > 0 Тогда + + стрКонтексты = Сред( пОписание, начало + 1, конец - начало - 1 ); + + Возврат СтрРазделить( стрКонтексты, "," ); + + Иначе + + Возврат Новый Массив; + + КонецЕсли; + +КонецФункции + +Функция ОписаниеФункциональности( Знач пОписание ) + + начало = СтрНайти( пОписание, "[" ); + + Если начало > 0 Тогда + + описаниеБезКонтекста = Лев( пОписание, начало - 1 ); + + Иначе + + описаниеБезКонтекста = пОписание; + + КонецЕсли; + + ПозицияКавычки = СтрНайти( описаниеБезКонтекста, """" ); + + Пока ПозицияКавычки > 0 Цикл + + ПозицияЗакрывающейКавычки = СтрНайти( Сред( описаниеБезКонтекста, ПозицияКавычки + 1 ), """" ) + ПозицияКавычки; + + Если ПозицияЗакрывающейКавычки = 0 Тогда + + Прервать; + + КонецЕсли; + + описаниеБезКонтекста = Лев( описаниеБезКонтекста, ПозицияКавычки - 1 ) + "<>" + Сред( описаниеБезКонтекста, ПозицияЗакрывающейКавычки + 1 ); + ПозицияКавычки = СтрНайти( описаниеБезКонтекста, """" ); + + КонецЦикла; + + ПозицияКавычки = СтрНайти( описаниеБезКонтекста, "'" ); + + Пока ПозицияКавычки > 0 Цикл + + ПозицияЗакрывающейКавычки = СтрНайти( Сред( описаниеБезКонтекста, ПозицияКавычки + 1 ), "'" ) + ПозицияКавычки; + + Если ПозицияЗакрывающейКавычки = 0 Тогда + + Прервать; + + КонецЕсли; + + описаниеБезКонтекста = Лев( описаниеБезКонтекста, ПозицияКавычки - 1 ) + "<>" + Сред( описаниеБезКонтекста, ПозицияЗакрывающейКавычки + 1 ); + ПозицияКавычки = СтрНайти( описаниеБезКонтекста, "'" ); + + КонецЦикла; + + начало = СтрНайти( пОписание, ":", НаправлениеПоиска.СКонца ); + + Если начало > 0 Тогда + + описаниеБезКонтекста = СокрЛП( Лев( описаниеБезКонтекста, начало - 1 ) ); + + КонецЕсли; + + Возврат СокрЛП( описаниеБезКонтекста ); + +КонецФункции + +Функция ПолучитьОписаниеСценарияАллюр2() + + СтруктураРезультата = Новый Структура(); + СтруктураРезультата.Вставить( "uuid", Строка( Новый УникальныйИдентификатор() ) ); + СтруктураРезультата.Вставить( "historyId", Неопределено ); + СтруктураРезультата.Вставить( "name", Неопределено ); + СтруктураРезультата.Вставить( "fullName", Неопределено ); + СтруктураРезультата.Вставить( "start", Неопределено ); + СтруктураРезультата.Вставить( "stop", Неопределено ); + СтруктураРезультата.Вставить( "statusDetails", Новый Структура( "known, muted,flaky", Ложь, Ложь, Ложь ) ); + СтруктураРезультата.Вставить( "status", Неопределено ); + СтруктураРезультата.Вставить( "stage", "finished" ); + СтруктураРезультата.Вставить( "steps", Новый Массив ); + СтруктураРезультата.Вставить( "parameters", Новый Массив ); + СтруктураРезультата.Вставить( "labels", Новый Массив ); + СтруктураРезультата.Вставить( "links", Новый Массив ); + СтруктураРезультата.Вставить( "attachments", Новый Массив ); + СтруктураРезультата.Вставить( "description", Неопределено ); + + Возврат СтруктураРезультата; + +КонецФункции + +Функция ПолучитьСсылкуНаСтроку( Знач пМетаданные, Знач пСтрока ) + + Если Не ЗначениеЗаполнено( ПутьКФайламПроекта ) Тогда + + Возврат ""; + + КонецЕсли; + + Если Не ЗначениеЗаполнено( пСтрока ) Тогда + + Возврат ""; + + КонецЕсли; + + компоненты = СтрРазделить( пМетаданные, "." ); + + Если компоненты.Количество() = 0 Тогда + + Возврат ""; + + КонецЕсли; + + компонентыСсылки = Новый Массив; + компонентыСсылки.Добавить( ПутьКФайламПроекта ); + + // Тип метаданных + + Если кэш = Неопределено Тогда + + кэш = Новый Структура; + + кэш.Вставить( "Метаданные", СоответствиеМетаданнымКаталогам() ); + кэш.Вставить( "Модули", СоответствиеМодулейФайлам() ); + + КонецЕсли; + + имяМетаданных = ВРег( компоненты[0] ); + + каталог = кэш.Метаданные[ имяМетаданных ]; + + Если Не ЗначениеЗаполнено( каталог ) Тогда + + Возврат ""; + + КонецЕсли; + + Если компоненты.Количество() < 3 Тогда + + Возврат ""; + + КонецЕсли; + + компонентыСсылки.Добавить( каталог ); + + // Имя объекта + + компонентыСсылки.Добавить( компоненты[1] ); + + типОбъекта = ВРег( компоненты[2] ); + + имяФайла = кэш.Модули[типОбъекта]; + + Если ЗначениеЗаполнено( имяФайла ) Тогда + + компонентыСсылки.Добавить( имяФайла ); + + ИначеЕсли типОбъекта = "ФОРМА" Тогда + + компонентыСсылки.Добавить( "Forms" ); + + Если компоненты.Количество() > 3 Тогда + + компонентыСсылки.Добавить( компоненты[3] ); + + КонецЕсли; + + Если компоненты.Количество() > 5 Тогда + + Если ВРег( компоненты[4] ) = "ФОРМА" + И ВРег( компоненты[5] ) = "МОДУЛЬ" Тогда + + компонентыСсылки.Добавить( "Module.bsl" ); + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли типОбъекта = "КОМАНДА" Тогда + + компонентыСсылки.Добавить( "Commands" ); + + Если компоненты.Количество() > 3 Тогда + + компонентыСсылки.Добавить( компоненты[3] ); + + КонецЕсли; + + Если компоненты.Количество() > 4 Тогда + + Если ВРег( компоненты[4] ) = "МОДУЛЬКОМАНДЫ" Тогда + + компонентыСсылки.Добавить( "CommandModule.bsl" ); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат СтрСоединить( компонентыСсылки, "/" ) + "#L" + СтрЗаменить( ВРег( пСтрока ), "СТРОКА ", "" ); + +КонецФункции + +Функция СоответствиеМетаданнымКаталогам() + + Соответствие = Новый Соответствие(); + + Соответствие.Вставить( "РегистрБухгалтерии", "AccountingRegisters" ); + Соответствие.Вставить( "РегистрНакопления", "AccumulationRegisters" ); + Соответствие.Вставить( "БизнесПроцесс", "BusinessProcesses" ); + Соответствие.Вставить( "РегистрРасчета", "CalculationRegisters" ); + Соответствие.Вставить( "Справочник", "Catalogs" ); + Соответствие.Вставить( "ПланСчетов", "ChartsOfAccounts" ); + Соответствие.Вставить( "ПланВидовРасчета", "ChartsOfCalculationTypes" ); + Соответствие.Вставить( "ПланВидовХарактеристик", "ChartsOfCharacteristicTypes" ); + Соответствие.Вставить( "ОбщаяГруппа", "CommandGroups" ); + Соответствие.Вставить( "ОбщийРеквизит", "CommonAttributes" ); + Соответствие.Вставить( "ОбщаяКоманда", "CommonCommands" ); + Соответствие.Вставить( "ОбщаяФорма", "CommonForms" ); + Соответствие.Вставить( "ОбщийМодуль", "CommonModules" ); + Соответствие.Вставить( "ОбщаяКартинка", "CommonPictures" ); + Соответствие.Вставить( "ОбщийМакет", "CommonTemplates" ); + Соответствие.Вставить( "Константа", "Constants" ); + Соответствие.Вставить( "Обработка", "DataProcessors" ); + Соответствие.Вставить( "ОпределяемыйТип", "DefinedTypes" ); + Соответствие.Вставить( "ЖурналДокумента", "DocumentJournals" ); + Соответствие.Вставить( "Нумератор", "DocumentNumerators" ); + Соответствие.Вставить( "Документ", "Documents" ); + Соответствие.Вставить( "Перечисление", "Enums" ); + Соответствие.Вставить( "ПодпискаНаСобытие", "EventSubscriptions" ); + Соответствие.Вставить( "ПланОбмена", "ExchangePlans" ); + Соответствие.Вставить( "ВнешнийИсточник", "ExternalDataSources" ); + Соответствие.Вставить( "КритерийОтбора", "FilterCriteria" ); + Соответствие.Вставить( "ФункциональнаяОпция", "FunctionalOptions" ); + Соответствие.Вставить( "ПарамертФункциональыхОпций", "FunctionalOptionsParameters" ); + Соответствие.Вставить( "HTTPСервис", "HTTPServices" ); + Соответствие.Вставить( "РегистрСведений", "InformationRegisters" ); + Соответствие.Вставить( "Язык", "Languages" ); + Соответствие.Вставить( "Отчет", "Reports" ); + Соответствие.Вставить( "Роль", "Roles" ); + Соответствие.Вставить( "РегламентноеЗадание", "ScheduledJobs" ); + Соответствие.Вставить( "Последовательность", "Sequences" ); + Соответствие.Вставить( "ПарамертСеанса", "SessionParameters" ); + Соответствие.Вставить( "ХранилищеНастроек", "SettingsStorages" ); + Соответствие.Вставить( "ЭлементСтиля", "StyleItems" ); + Соответствие.Вставить( "Подсистема", "Subsystems" ); + Соответствие.Вставить( "Задача", "Tasks" ); + Соответствие.Вставить( "WebСервис", "WebServices" ); + Соответствие.Вставить( "XDTOПакет", "XDTOPackages" ); + + соотВРег = Новый Соответствие; + + Для Каждого цЭлемент Из Соответствие Цикл + + соотВРег.Вставить( ВРег( цЭлемент.Ключ ), цЭлемент.Значение ); + + КонецЦикла; + + Возврат соотВРег; + +КонецФункции + +Функция СоответствиеМодулейФайлам() + + Соответствие = Новый Соответствие(); + + Соответствие.Вставить( "МОДУЛЬОБЪЕКТА", "ObjectModule.bsl" ); + Соответствие.Вставить( "МОДУЛЬ", "Module.bsl" ); + Соответствие.Вставить( "МОДУЛЬМЕНЕДЖЕРА", "ManagerModule.bsl" ); + Соответствие.Вставить( "МОДУЛЬНАБОРАЗАПИСЕЙ", "RecordSetModule.bsl" ); + + Возврат Соответствие; + +КонецФункции + +Процедура ЗаписатьФайлJSON(Знач ИмяФайла, Знач пЗначение) + + Запись = Новый ЗаписьТекста; + Запись.Открыть(ИмяФайла); + Запись.Записать(ПарсерJSON.ЗаписатьJSON(пЗначение)); + Запись.Закрыть(); + +КонецПроцедуры + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" index 5211b3d8..3398c0b5 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров +// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды // diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" index 7ff075ed..d3092cb2 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров +// Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды // diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" index 2c8ffe9e..be309285 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" @@ -48,8 +48,9 @@ ДанныеПодключения = ПараметрыКоманды["ДанныеПодключения"]; СтрокаПодключения = ДанныеПодключения.СтрокаПодключения; + //Исключаем ситуацию с Неопределено или еще с Булево. Если Не ЗначениеЗаполнено(СтрокаПодключения) Тогда - СтрокаПодключения = "/F"; + СтрокаПодключения = ""; КонецЕсли; МенеджерКонфигуратора = Новый МенеджерКонфигуратора; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" index f3eea19d..4ac443f7 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" @@ -1,8 +1,8 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // // Запуск тестирования через фреймворк xUnitFor1C -// -// oscript src/main.os xunit C:\projects\xUnitFor1C\Tests\Smoke --pathxunit C:\projects\xUnitFor1C\xddTestRunner.epf +// +// oscript src/main.os xunit C:\projects\xUnitFor1C\Tests\Smoke --pathxunit C:\projects\xUnitFor1C\xddTestRunner.epf // --reportsxunit "ГенераторОтчетаJUnitXML{build/junit.xml};ГенераторОтчетаAllureXML{build/allure.xml}" // --reportsxunit "GenerateReportJUnitXML{build/junit.xml};GenerateReportAllureXML{build/allure.xml}" // @@ -10,7 +10,7 @@ // // Служебный модуль с набором методов работы с командами приложения // -// Структура модуля реализована в соответствии с рекомендациями +// Структура модуля реализована в соответствии с рекомендациями // oscript-app-template (C) EvilBeaver // /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -29,73 +29,75 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ТекстОписания = + НастройкиДля1С.ДобавитьШаблоннуюПеременную("addRoot", add.КаталогИнструментов()); + + ТекстОписания = " Запуск тестирования через фреймворк ADD.xUnitFor1C | "; - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "testsPath", - "[env RUNNER_TESTSPATH] Путь к каталогу или к файлу с тестами + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "testsPath", + "[env RUNNER_TESTSPATH] Путь к каталогу или к файлу с тестами |или к встроенным тестам, если явно указан ключ --config-tests. |Возможные варианты указания подсистемы или конкретного теста: | Метаданные.Подсистемы.Тестовая | Метаданные.Подсистемы.Тестовая.Подсистемы.Подсистема1 | Метаданные.Обработки.Тест"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace", " |[env RUNNER_WORKSPACE] путь к папке, относительно которой будут определятся макросы $workspace. | по умолчанию текущий."); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--config-tests", + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--config-tests", "[env RUNNER_CONFIG_TESTS] загружать тесты, встроенные в конфигурации в указанную подсистему"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--pathxunit", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--pathxunit", "[env RUNNER_PATHXUNIT] путь к внешней обработке, по умолчанию ищу в пакете add"); ОписаниеОтчетов = " --reportsxunit параметры формирования отчетов в формате вида:"; - ОписаниеОтчетов = ОписаниеОтчетов + + ОписаниеОтчетов = ОписаниеОтчетов + " ФорматВыводаОтчета{Путь к файлу отчета};ФорматВыводаОтчета{Путь к файлу отчета}..."; - ОписаниеОтчетов = ОписаниеОтчетов + + ОписаниеОтчетов = ОписаниеОтчетов + " Пример: ГенераторОтчетаJUnitXML{build/junit.xml};ГенераторОтчетаAllureXML{build/allure.xml}"; - ОписаниеОтчетов = ОписаниеОтчетов + + ОписаниеОтчетов = ОписаниеОтчетов + " Пример (англоязычный вариант): GenerateReportJUnitXML{build/junit.xml};GenerateReportAllureXML{build/allure.xml}"; Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--reportsxunit", ОписаниеОтчетов); - + ОписаниеСтатуса = " --xddExitCodePath путь к текстовому файлу, обозначающему статус выполнению."; ОписаниеСтатуса = ОписаниеСтатуса + " Внутри файла строка-значение 0 (тесты пройдены), 1 (тесты не пройдены)"; - + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--xddExitCodePath", ОписаниеСтатуса); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--xddConfig", "Путь к конфигурационному файлу xUnitFor1c"); ОписаниеТестКлиент = "Параметры подключения к тест-клиенту вида --testclient ИмяПользователя:Пароль:Порт"; - ОписаниеТестКлиент = ОписаниеТестКлиент + + ОписаниеТестКлиент = ОписаниеТестКлиент + " Пример 1: --testclient Администратор:пароль:1538"; - ОписаниеТестКлиент = ОписаниеТестКлиент + + ОписаниеТестКлиент = ОписаниеТестКлиент + " Пример 2: --testclient ::1538 (клиент тестирования будет запущен с реквизитами менеджера тестирования)"; Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--testclient", ОписаниеТестКлиент); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--reportxunit", "путь к каталогу с отчетом jUnit (устарел)"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional", "Дополнительные параметры для запуска предприятия."); - - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait", + + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait", "Не ожидать завершения запущенной команды/действия"); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--xdddebug", + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--xdddebug", "Выводить отладочные сообщения при прогоне тестов"); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-shutdown", + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-shutdown", "Не завершать работу 1С:Предприятие после выполнения тестов"); Парсер.ДобавитьКоманду(ОписаниеКоманды); - + КонецПроцедуры // ЗарегистрироватьКоманду // Выполняет логику команды -// +// // Параметры: // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений // ДополнительныеПараметры - Соответствие - дополнительные параметры (необязательно) @@ -111,13 +113,13 @@ ЗапускатьТолстыйКлиент = ОбщиеМетоды.УказанПараметрТолстыйКлиент(ПараметрыКоманды["--ordinaryapp"], Лог); ОжидатьЗавершения = Не ПараметрыКоманды["--no-wait"]; - ПараметрыОтчетовXUnit = ПараметрыОтчетовXUnit(ПараметрыКоманды["--reportsxunit"], + ПараметрыОтчетовXUnit = ПараметрыОтчетовXUnit(ПараметрыКоманды["--reportsxunit"], ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--reportxunit"])); ОбеспечитьСуществованиеРодительскихКаталоговДляПутей(ПараметрыОтчетовXUnit); ДанныеПодключения = ПараметрыКоманды["ДанныеПодключения"]; - + МенеджерКонфигуратора = Новый МенеджерКонфигуратора; МенеджерКонфигуратора.Инициализация( ДанныеПодключения.СтрокаПодключения, ДанныеПодключения.Пользователь, ДанныеПодключения.Пароль, @@ -127,12 +129,12 @@ Попытка ЗапуститьТестироватьЮнит( - ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["testsPath"]), + ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["testsPath"]), ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--workspace"]), ПараметрыОтчетовXUnit, ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--xddExitCodePath"]), ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--pathxunit"]), ЗапускатьТолстыйКлиент, - ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--xddConfig"]), + ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--xddConfig"]), ОжидатьЗавершения, ПараметрыКоманды["--additional"], ПараметрыКоманды["--config-tests"], @@ -150,10 +152,10 @@ Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех; КонецФункции // ВыполнитьКоманду -// Выполняем запуск тестов для xunit +// Выполняем запуск тестов для xunit // // Параметры: -// ПутьВходящихДанных - <Строка> - Может принимать путь к каталогу, так и к файлу для тестирования, +// ПутьВходящихДанных - <Строка> - Может принимать путь к каталогу, так и к файлу для тестирования, // или пути к встроенным тестам // РабочийКаталогПроекта - <Строка> - Путь к каталогу с проектом, по умолчанию каталог ./ // ФормируемыеОтчеты - <Структура> - Коллекция описания формирования отчетов тестирования @@ -163,14 +165,14 @@ // ДопПараметры - <Строка> - дополнительные параметры для передачи в параметры запуска 1с, например /DebugURLtcp://localhost // ЗагружатьВстроенныеТесты - <Булево> - Загружать тесты, встроенные в конфигурацию // ТестКлиент - <Строка> - Параметры подключения к тест-клиенту -// ВключенаОтладкаТестирования - Булево - -// Завершать1СПослеТестирования - Булево - +// ВключенаОтладкаТестирования - Булево - +// Завершать1СПослеТестирования - Булево - // -Процедура ЗапуститьТестироватьЮнит(Знач ПутьВходящихДанных, +Процедура ЗапуститьТестироватьЮнит(Знач ПутьВходящихДанных, Знач РабочийКаталогПроекта, Знач ФормируемыеОтчеты, Знач ПутьФайлаСтатусаТестирования, - Знач ПутьКИнструментам = "", Знач ТолстыйКлиент = Ложь, + Знач ПутьКИнструментам = "", Знач ТолстыйКлиент = Ложь, Знач ПутьККонфигурационномуФайлу, Знач ОжидатьЗавершения = Истина, Знач ДопПараметры="", @@ -180,26 +182,26 @@ Знач Завершать1СПослеТестирования = Истина) Лог.Информация("Выполняю тесты с помощью фреймворка ADD - %1", ПутьВходящихДанных); - - Если Не ЗначениеЗаполнено(РабочийКаталогПроекта) Тогда + + Если Не ЗначениеЗаполнено(РабочийКаталогПроекта) Тогда РабочийКаталогПроекта = "./"; КонецЕсли; РабочийКаталогПроекта = ОбщиеМетоды.ПолныйПуть(РабочийКаталогПроекта); - + Если ПустаяСтрока(ПутьКИнструментам) Тогда ПутьКИнструментам = add.ПутьИнструментаТДД(); КонецЕсли; - + ФайлСуществует = Новый Файл(ПутьКИнструментам).Существует(); Ожидаем.Что(ФайлСуществует, СтрШаблон("Ожидаем, что файл <%1> существует, а его нет!", ПутьКИнструментам)).ЭтоИстина(); - + Если Не ЗагружатьВстроенныеТесты Тогда Если Новый Файл(ПутьВходящихДанных).ЭтоКаталог() Тогда КлючЗапуска = """xddRun ЗагрузчикКаталога """""+ПутьВходящихДанных+""""";"; Иначе КлючЗапуска = """xddRun ЗагрузчикФайла """""+ПутьВходящихДанных+""""";"; КонецЕсли; - Иначе + Иначе КлючЗапуска = """xddRun ЗагрузчикИзПодсистемКонфигурации """""+ПутьВходящихДанных+""""";"; КонецЕсли; @@ -207,19 +209,19 @@ КлючЗапуска = КлючЗапуска + СтрШаблон(" xddTestClient """"%1"""" ; ", ТестКлиент); КонецЕсли; - + Для каждого ПараметрыОтчета Из ФормируемыеОтчеты Цикл Генератор = СтрЗаменить(ПараметрыОтчета.Ключ, "GenerateReport", "ГенераторОтчета"); КлючЗапуска = КлючЗапуска + "xddReport " + Генератор + " """"" + ПараметрыОтчета.Значение + """"";"; КонецЦикла; Если Не ПустаяСтрока(ПутьККонфигурационномуФайлу) Тогда - КлючЗапуска = КлючЗапуска + + КлючЗапуска = КлючЗапуска + СтрШаблон(" xddConfig """"%1"""" ; ", ПутьККонфигурационномуФайлу); КонецЕсли; Если Не ПустаяСтрока(ПутьФайлаСтатусаТестирования) Тогда - КлючЗапуска = КлючЗапуска + + КлючЗапуска = КлючЗапуска + СтрШаблон(" xddExitCodePath ГенерацияКодаВозврата """"%1"""" ; ", ПутьФайлаСтатусаТестирования); КонецЕсли; @@ -227,7 +229,7 @@ Настройки = НастройкиДля1С.ПрочитатьНастройки(ПутьККонфигурационномуФайлу); - ПутьЛогаВыполненияСценариев = НастройкиДля1С.ПолучитьНастройку(Настройки, "ИмяФайлаЛогВыполненияСценариев", + ПутьЛогаВыполненияСценариев = НастройкиДля1С.ПолучитьНастройку(Настройки, "ИмяФайлаЛогВыполненияСценариев", "./build/xddonline.txt", РабочийКаталогПроекта, "путь к лог-файлу выполнения"); Если ВключенаОтладкаТестирования Тогда @@ -239,7 +241,7 @@ Если Завершать1СПослеТестирования Тогда КлючЗапуска = КлючЗапуска + " xddShutdown "; КонецЕсли; - + КлючЗапуска = КлючЗапуска + " """; Лог.Отладка(КлючЗапуска); @@ -248,12 +250,12 @@ МенеджерКонфигуратора.ЗапуститьВРежимеПредприятияСПроверкойВыполнения( "ЗапуститьТестироватьЮнит", - КлючЗапуска, ПутьКИнструментам, + КлючЗапуска, ПутьКИнструментам, ТолстыйКлиент, ДополнительныеКлючи, ОжидатьЗавершения, ПутьЛогаВыполненияСценариев, ПутьФайлаСтатусаТестирования); Лог.Информация("Выполнение тестов завершено"); - + КонецПроцедуры // ЗапуститьТестироватьЮнит() Функция ПараметрыОтчетовXUnit(Знач ПереданныеПараметрыОтчетов, Знач ВыходнойКаталогОтчета = "") @@ -268,10 +270,10 @@ Для каждого ПараметрВывода Из ПараметрыВыводаОтчетов Цикл ПозицияОткрывающейСкобки = СтрНайти(ПараметрВывода, "{"); ПозицияЗакрывающейСкобки = СтрНайти(ПараметрВывода, "}"); - + ФорматВывода = СокрЛП(Лев(ПараметрВывода, ПозицияОткрывающейСкобки - 1)); - - ПереданныйПуть = СокрЛП(Сред(ПараметрВывода, ПозицияОткрывающейСкобки + 1, + + ПереданныйПуть = СокрЛП(Сред(ПараметрВывода, ПозицияОткрывающейСкобки + 1, ПозицияЗакрывающейСкобки - ПозицияОткрывающейСкобки - 1)); ПутьВывода = ОбщиеМетоды.ПолныйПуть(ПереданныйПуть); @@ -279,7 +281,7 @@ НаборПараметров.Вставить(ФорматВывода, ПутьВывода); КонецЦикла; КонецЕсли; - + Возврат НаборПараметров; КонецФункции // ПараметрыОтчетовXUnit() @@ -292,7 +294,7 @@ ОбъектКаталог = Новый Файл(Файл.Путь); ФС.ОбеспечитьКаталог(ОбъектКаталог.ПолноеИмя); - + Если Не ОбъектКаталог.Существует() Тогда ЕстьОшибка = Истина; СообщениеОшибки = СтрШаблон("%1 %2", СообщениеОшибки, ОбъектКаталог.ПолноеИмя); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" index 66e15209..f74b0309 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" @@ -4,12 +4,12 @@ // // Пример строки запуска: // oscript src/main.os vanessa --pathvanessa ".\vanessa-behavior\vanessa-behavior.epf" --ibconnection /F./build/ib --vanessasettings ./examples\.vb-conf.json -// +// // TODO добавить фичи для проверки команды -// +// // Служебный модуль с набором методов работы с командами приложения // -// Структура модуля реализована в соответствии с рекомендациями +// Структура модуля реализована в соответствии с рекомендациями // oscript-app-template (C) EvilBeaver // /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -28,36 +28,38 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ТекстОписания = + НастройкиДля1С.ДобавитьШаблоннуюПеременную("addRoot", add.КаталогИнструментов()); + + ТекстОписания = " Запуск тестирования через фреймворк ADD.vanessa-behavior | "; - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--path", "Путь для запуска тестов |Можно указывать как каталог с фичами, так и конкретную фичу"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--pathvanessa", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--pathvanessa", "[env RUNNER_PATHVANESSA] путь к внешней обработке, по умолчанию /lib/add/bddRunner.epf | или переменная окружения RUNNER_PATHVANESSA"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--vanessasettings", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--vanessasettings", "[env RUNNER_VANESSASETTINGS] путь к файлу настроек"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace", "[env RUNNER_WORKSPACE] путь к папке, относительно которой будут определятся макросы $workspace. | по умолчанию текущий."); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional", "Дополнительные параметры для запуска предприятия."); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait", + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait", "Не ожидать завершения запущенной команды/действия"); Парсер.ДобавитьКоманду(ОписаниеКоманды); - + КонецПроцедуры // ЗарегистрироватьКоманду // Выполняет логику команды -// +// // Параметры: // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений // ДополнительныеПараметры (необязательно) - Соответствие - дополнительные параметры @@ -84,13 +86,18 @@ ПутьКФичам = ""; Если ПараметрыКоманды.Получить("--path") <> Неопределено Тогда ПутьКФичам = ПараметрыКоманды["--path"]; + + Ожидаем.Что(ЗапускатьТолстыйКлиент = Истина, + "Нельзя одновременно указывать ключи запуска --ordinaryapp 1 и --path ПутьХХХ, + | т.к. Vanessa.ADD в толстом клиенте для обычных форм не поддерживает указание фич через командную строку.") + .ЭтоЛожь(); КонецЕсли; - + Попытка ЗапуститьТестироватьПоведение( ПутьКФичам, ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--workspace"]), - ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--vanessasettings"]), + ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--vanessasettings"]), ОбщиеМетоды.ПолныйПуть(ПараметрыКоманды["--pathvanessa"]), ЗапускатьТолстыйКлиент, ОжидатьЗавершения, ПараметрыКоманды["--additional"] @@ -102,11 +109,11 @@ КонецПопытки; МенеджерКонфигуратора.Деструктор(); - + Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех; КонецФункции // ВыполнитьКоманду -// Выполняем запуск тестов для vannessa +// Выполняем запуск тестов для vannessa // // Параметры: // ПутьКФичам - <Строка> - Путь к фичам, может быть пустым @@ -114,20 +121,20 @@ // ПутьКНастройкам - <Строка> - Путь к файлу настроек запуска тестов // ПутьКИнструментам - <Строка> - пут Булево, Неопределеноь к инструментам, по умолчанию ./vendor/vanessa-behavior // ТолстыйКлиент - Булево, Неопределено - признак запуска толстого клиента -// ОжидатьЗавершения - <Булево> - признак запуска ожидания, пока 1С завершиться, +// ОжидатьЗавершения - <Булево> - признак запуска ожидания, пока 1С завершиться, // для разработки освобождения командной строки надо ставить Ложь; // ДопПараметры - <Строка> - дополнительные параметры для передачи в параметры запуска 1с, например /DebugURLtcp://localhost // Процедура ЗапуститьТестироватьПоведение(Знач ПутьКФичам = Неопределено, - Знач РабочийКаталогПроекта = Неопределено, - Знач ПутьКНастройкам = "", Знач ПутьКИнструментам="", Знач ТолстыйКлиент = Ложь, - Знач ОжидатьЗавершения = Истина, Знач ДопПараметры="") + Знач РабочийКаталогПроекта = Неопределено, + Знач ПутьКНастройкам = "", Знач ПутьКИнструментам="", Знач ТолстыйКлиент = Ложь, + Знач ОжидатьЗавершения = Истина, Знач ДопПараметры="") Лог.Информация("Тестирую поведение с помощью фреймворка ADD"); // Лог.УстановитьУровень(УровниЛога.Отладка); Лог.Отладка("РабочийКаталогПроекта <%1>", РабочийКаталогПроекта); - Если РабочийКаталогПроекта = Неопределено Тогда + Если РабочийКаталогПроекта = Неопределено Тогда РабочийКаталогПроекта = "./"; КонецЕсли; РабочийКаталогПроекта = ОбщиеМетоды.ПолныйПуть(РабочийКаталогПроекта); @@ -136,10 +143,10 @@ Если ПутьКФичам <> Неопределено Тогда ПутьКФичам = ОбщиеМетоды.ПолныйПуть(ПутьКФичам); Лог.Отладка("Абсолютный путь ПутьКФичам <%1>", ПутьКФичам); - + УстановитьПеременнуюСреды("VANESSA_FEATUREPATH", ПутьКФичам); КонецЕсли; - + Если ПустаяСтрока(ПутьКИнструментам) Тогда ПутьКИнструментам = add.ПутьИнструментаБДД(); Лог.Отладка("Не задан путь к запускателю bdd-тестов. Использую путь по умолчанию %1", ПутьКИнструментам); @@ -155,10 +162,10 @@ Настройки = НастройкиДля1С.ПрочитатьНастройки(ПутьКНастройкам); - ПутьКФайлуСтатусаВыполнения = НастройкиДля1С.ПолучитьНастройку(Настройки, "ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев", + ПутьКФайлуСтатусаВыполнения = НастройкиДля1С.ПолучитьНастройку(Настройки, "ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев", "./build/buildstatus.log", РабочийКаталогПроекта, "путь к файлу статуса выполнения"); - ПутьЛогаВыполненияСценариев = НастройкиДля1С.ПолучитьНастройку(Настройки, "ИмяФайлаЛогВыполненияСценариев", + ПутьЛогаВыполненияСценариев = НастройкиДля1С.ПолучитьНастройку(Настройки, "ИмяФайлаЛогВыполненияСценариев", "./build/vanessaonline.txt", РабочийКаталогПроекта, "путь к лог-файлу выполнения"); КлючЗапуска = """StartFeaturePlayer;VBParams=" + ПутьКНастройкам +";workspaceRoot=" + РабочийКаталогПроекта + """"; @@ -168,10 +175,10 @@ МенеджерКонфигуратора.ЗапуститьВРежимеПредприятияСПроверкойВыполнения( "ЗапуститьТестироватьПоведение", - КлючЗапуска, ПутьКИнструментам, + КлючЗапуска, ПутьКИнструментам, ТолстыйКлиент, ДополнительныеКлючи, ОжидатьЗавершения, ПутьЛогаВыполненияСценариев, ПутьКФайлуСтатусаВыполнения); - + Лог.Информация("Тестирование поведения завершено"); КонецПроцедуры // ЗапуститьТестироватьПоведение() diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" index 62f0c701..dfface44 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" @@ -261,8 +261,11 @@ Приостановить(Пауза_ДесятьСек); ОтключитьСоединенияСРабочимиПроцессами(); КонецЕсли; - - Прервать; + + Сеансы = ПолучитьСписокСеансов(); + Если Сеансы.Количество()=0 Тогда + Прервать; + КонецЕсли; Исключение ВызватьИсключение СтрШаблон("Попытка удаления сеансов не удалась. Текст ошибки: @@ -300,7 +303,7 @@ КонецЕсли; - КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --sessions-deny=%5 --denied-message=""%6"" --denied-from=""%8"" --denied-to= --permission-code=""%7""", + КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --sessions-deny=%5 --denied-message=""%6"" --denied-from=""%8"" --permission-code=""%7""", ИдентификаторКластера, КлючиАвторизацииВКластере(), ИдентификаторБазы, @@ -474,50 +477,12 @@ Функция ЗапуститьПроцесс(Знач СтрокаВыполнения) - Перем ПаузаОжиданияЧтенияБуфера; - - ПаузаОжиданияЧтенияБуфера = 20; - - Лог.Отладка(СтрокаВыполнения); - Процесс = СоздатьПроцесс(СтрокаВыполнения, ,Истина); - Процесс.Запустить(); - - Текст = Новый ТекстовыйДокумент; - - Пока Истина Цикл - - ВывестиДанныеПроцесса(Процесс, Текст); - - Если Процесс.Завершен Тогда - Процесс.ОжидатьЗавершения(); // финальный сброс буферов - ВывестиДанныеПроцесса(Процесс, Текст); - Прервать; - КонецЕсли; - - Приостановить(ПаузаОжиданияЧтенияБуфера); - - КонецЦикла; - - Если Процесс.КодВозврата = 0 Тогда - Возврат Текст.ПолучитьТекст(); - Иначе - ВызватьИсключение "Сообщение от RAS/RAC - |" + Текст.ПолучитьТекст(); - КонецЕсли; + + Возврат ОбщиеМетоды.ЗапуститьПроцесс(СтрокаВыполнения); + КонецФункции -Процедура ВывестиДанныеПроцесса(Знач Процесс, Знач Приемник) - Вывод = Процесс.ПотокВывода.Прочитать(); - Ошибки = Процесс.ПотокОшибок.Прочитать(); - Если СтрДлина(Строка(Вывод)) > 0 Тогда - Приемник.ДобавитьСтроку(Вывод); - КонецЕсли; - Если СтрДлина(Строка(Ошибки)) > 0 Тогда - Приемник.ДобавитьСтроку(Ошибки); - КонецЕсли; -КонецПроцедуры - Процедура ОтключитьСуществующиеСеансы() Лог.Информация("Отключаю существующие сеансы"); @@ -611,21 +576,10 @@ КлючиАвторизацииВКластере()) + " " + мНастройки.АдресСервераАдминистрирования; Лог.Информация("Получаю список рабочих процессов..."); - СписокПроцессов = ВыполнитьКоманду(КомандаЗапускаПроцессы); + СписокПроцессов = ЗапуститьПроцесс(КомандаЗапускаПроцессы); Результат = РазобратьПоток(СписокПроцессов); - НеВФильтре = Новый Массив; - Для Каждого ТекПроцесс Из Результат Цикл - Если Не СеансВФильтре(Новый Структура("Приложение, Пользователь", ТекПроцесс["app-id"], ТекПроцесс["user-name"])) Тогда - НеВФильтре.Добавить(ТекПроцесс); - КонецЕсли; - КонецЦикла; - - Для Каждого Уд Из НеВФильтре Цикл - Результат.Удалить(Уд); - КонецЦикла; - Возврат Результат; КонецФункции @@ -639,29 +593,39 @@ КлючиАвторизацииВБазе(), РабочийПроцесс["process"]) + " " + мНастройки.АдресСервераАдминистрирования; - Лог.Информация("Получаю список соединений..."); - Возврат РазобратьПоток(ВыполнитьКоманду(КомандаЗапускаСоединения)); + Лог.Информация("Получаю список соединений рабочего процесса..."); + Соединения = РазобратьПоток(ЗапуститьПроцесс(КомандаЗапускаСоединения)); + + Результат = Новый Массив; + Для Каждого ТекПроцесс Из Соединения Цикл + Если СеансВФильтре(Новый Структура("Приложение, Пользователь", ТекПроцесс["app-id"], ТекПроцесс["user-name"])) + И ВРег(ТекПроцесс["app-id"])<>"RAS" Тогда + Результат.Добавить(ТекПроцесс); + КонецЕсли; + КонецЦикла; + + Возврат Результат; КонецФункции Функция РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение) - КомандаРазрывСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection disconnect --cluster=""%1""%2 --infobase=%3%4 --process=%5 --connection=%6", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы(), - КлючиАвторизацииВБазе(), - РабочийПроцесс["process"], - Соединение["connection"]) + " " + мНастройки.АдресСервераАдминистрирования; + КомандаРазрывСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection disconnect --cluster=""%1""%2 %3 --process=%4 --connection=%5", + ИдентификаторКластера(), + КлючиАвторизацииВКластере(), + КлючиАвторизацииВБазе(), + РабочийПроцесс["process"], + Соединение["connection"]) + " " + мНастройки.АдресСервераАдминистрирования; Сообщение = СтрШаблон("Отключаю соединение %1 [%2] (%3)", - Соединение["conn-id"], - Соединение["app-id"], - Соединение["user-name"]); + Соединение["conn-id"], + Соединение["app-id"], + Соединение["user-name"] + ); Лог.Информация(Сообщение); - Возврат ВыполнитьКоманду(КомандаРазрывСоединения); + Возврат ЗапуститьПроцесс(КомандаРазрывСоединения); КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" index 8e0bf13c..4d065ef8 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -473,8 +473,12 @@ Ожидаем.Что(ПутьХранилища, ТекущаяПроцедура+" не задана строка подключения к хранилищу").Заполнено(); Ожидаем.Что(ЛогинАдминистратора, ТекущаяПроцедура+" не задан пользователь хранилища").Заполнено(); - УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогВременнойИБ); - УправлениеКонфигуратором.УстановитьКонтекст("/F " + КаталогВременнойИБ, "", ""); + КонтекстБД = УправлениеКонфигуратором.ПолучитьКонтекст(); + Если Не ЗначениеЗаполнено(КонтекстБД.КлючСоединенияСБазой) Тогда + Лог.Предупреждение("При создании хранилища не определена БД, создаем на основе временной БД"); + УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогВременнойИБ); + УправлениеКонфигуратором.УстановитьКонтекст("/F " + КаталогВременнойИБ, "", ""); + КонецЕсли; ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации(); ХранилищеКонфигурации.УстановитьУправлениеКонфигуратором(УправлениеКонфигуратором); @@ -609,6 +613,40 @@ КонецПроцедуры +Процедура КопироватьПользователейИзХранилища(Знач ПутьХранилища, Знач Логин, Знач Пароль, + Знач ПутьХранилищаКопия, Знач ЛогинКопия, Знач ПарольКопия, + Знач ВосстановитьУдаленного = Ложь) Экспорт + + Лог.Информация("Выполняю копирование пользователей из хранилища конфигурации"); + + ТекущаяПроцедура = "КопироватьПользователейИзХранилища"; + + УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогВременнойИБ); + УправлениеКонфигуратором.УстановитьКонтекст("/F " + КаталогВременнойИБ, "", ""); + + ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации(); + ХранилищеКонфигурации.УстановитьУправлениеКонфигуратором(УправлениеКонфигуратором); + ХранилищеКонфигурации.УстановитьПараметрыАвторизации(Логин, Пароль); + + ХранилищеКонфигурации.УстановитьПутьКХранилищу(ПутьХранилища); + + Попытка + ХранилищеКонфигурации.КопироватьПользователейИзХранилища( + ПутьХранилищаКопия, + ЛогинКопия, + ПарольКопия, + ВосстановитьУдаленного); + + Лог.Информация("Копирование пользователей из хранилища конфигурации завершено"); + Исключение + Сообщение = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + Лог.Ошибка(УправлениеКонфигуратором.ВыводКоманды()); + ВызватьИсключение ТекущаяПроцедура + " + |" + Сообщение; + КонецПопытки; + +КонецПроцедуры + // Выгрузить файл конфигурации определенной версии из хранилища 1С // // Параметры: diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" index 355e910f..fb51320f 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" @@ -2,7 +2,7 @@ // // Служебный модуль с набором служебных параметров приложения // -// Структура модуля реализована в соответствии с рекомендациями +// Структура модуля реализована в соответствии с рекомендациями // oscript-app-template (C) EvilBeaver // /////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ // Функция ВерсияПродукта() Экспорт - Версия = "1.5.0";// присвоение "Версия = " важно для проверки Сонара + Версия = "1.6.0";// присвоение "Версия = " важно для проверки Сонара Возврат Версия; КонецФункции // ВерсияПродукта() @@ -45,21 +45,22 @@ КонецФункции Функция ВозможныеКоманды() Экспорт - + Если мВозможныеКоманды = Неопределено Тогда + мВозможныеКоманды = Новый Структура; мВозможныеКоманды.Вставить("ИнициализацияОкружения", "init-dev"); мВозможныеКоманды.Вставить("ОбновлениеОкружения", "update-dev"); - + мВозможныеКоманды.Вставить("СборкаРасширений", "compileext"); мВозможныеКоманды.Вставить("ОбновлениеРасширений", "updateext"); мВозможныеКоманды.Вставить("РазборкаРасширений", "decompileext"); мВозможныеКоманды.Вставить("СборкаВнешнихОбработок", "compileepf"); мВозможныеКоманды.Вставить("РазборкаВнешнихОбработок", "decompileepf"); - + мВозможныеКоманды.Вставить("Тестирование_xUnitFor1C", "xunit"); мВозможныеКоманды.Вставить("ТестироватьПоведение", "vanessa"); - + мВозможныеКоманды.Вставить("ЗапуститьВРежимеПредприятия", "run"); мВозможныеКоманды.Вставить("ОбновитьКонфигурациюБазыДанных", "updatedb"); мВозможныеКоманды.Вставить("ВыгрузитьКонфигурациюВФайл", "unload"); @@ -71,11 +72,12 @@ мВозможныеКоманды.Вставить("СоздатьХранилище", "createrepo"); мВозможныеКоманды.Вставить("ПодключитьсяКХранилищу", "bindrepo"); мВозможныеКоманды.Вставить("СоздатьПользователейХранилища", "createrepouser"); + мВозможныеКоманды.Вставить("КопироватьПользователейХранилища", "copyrepouser"); мВозможныеКоманды.Вставить("СохранитьВерсиюХранилищаВФайл", "unloadcfrepo"); мВозможныеКоманды.Вставить("ЗахватитьВХранилище", "lockrepo"); мВозможныеКоманды.Вставить("ПоместитьВХранилище", "commit"); мВозможныеКоманды.Вставить("ОтключитьсяОтХранилища", "unbindrepo"); - + мВозможныеКоманды.Вставить("СобратьИзИсходниковФайлКонфигурации", "compile"); мВозможныеКоманды.Вставить("РазборкаКонфигурации", "decompile"); мВозможныеКоманды.Вставить("СобратьИзИсходниковФайлРасширения", "compileexttocfe"); @@ -86,15 +88,19 @@ мВозможныеКоманды.Вставить("УправлениеСеансами", "session"); мВозможныеКоманды.Вставить("УправлениеРегламентнымиЗаданиями", "scheduledjobs"); мВозможныеКоманды.Вставить("ЗапроситьПараметрыБД", "dbinfo"); - + мВозможныеКоманды.Вставить("Помощь", "help"); мВозможныеКоманды.Вставить("ПомощьУстаревшая", "--help"); мВозможныеКоманды.Вставить("ПоказатьВерсию", "version"); + + мВозможныеКоманды.Вставить("ПроверкаПроектаEDT", "edt-validate"); + мВозможныеКоманды = Новый ФиксированнаяСтруктура(мВозможныеКоманды); + КонецЕсли; - + Возврат мВозможныеКоманды; - + КонецФункции Процедура ПриРегистрацииКомандПриложения(Знач КлассыРеализацииКоманд) Экспорт @@ -104,16 +110,16 @@ КлассыРеализацииКоманд[ИмяКомандыВерсия()] = "КомандаVersion"; КлассыРеализацииКоманд[ВозможныеКоманды().ИнициализацияОкружения] = "КомандаИнициализацияОкружения"; КлассыРеализацииКоманд[ВозможныеКоманды().ОбновлениеОкружения] = "КомандаОбновлениеОкружения"; - + КлассыРеализацииКоманд[ВозможныеКоманды().СборкаРасширений] = "КомандаСборкаРасширений"; КлассыРеализацииКоманд[ВозможныеКоманды().ОбновлениеРасширений] = "КомандаОбновлениеРасширений"; КлассыРеализацииКоманд[ВозможныеКоманды().РазборкаРасширений] = "КомандаРазборкаРасширений"; КлассыРеализацииКоманд[ВозможныеКоманды().РазборкаВнешнихОбработок] = "КомандаРазборкаВнешнихОбработок"; КлассыРеализацииКоманд[ВозможныеКоманды().СборкаВнешнихОбработок] = "КомандаСборкаВнешнихОбработок"; - + КлассыРеализацииКоманд[ВозможныеКоманды().Тестирование_xUnitFor1C] = "КомандаТестирование_xUnitFor1C"; КлассыРеализацииКоманд[ВозможныеКоманды().ТестироватьПоведение] = "КомандаТестированиеПоведения"; - + КлассыРеализацииКоманд[ВозможныеКоманды().ЗапуститьВРежимеПредприятия] = "КомандаЗапуститьВРежимеПредприятия"; КлассыРеализацииКоманд[ВозможныеКоманды().ОбновитьКонфигурациюБазыДанных] = "КомандаОбновлениеКонфигурацииБД"; КлассыРеализацииКоманд[ВозможныеКоманды().ВыгрузитьКонфигурациюВФайл] = "КомандаВыгрузитьКонфигурациюВФайл"; @@ -121,16 +127,17 @@ КлассыРеализацииКоманд[ВозможныеКоманды().СобратьИзИсходниковФайлРасширения] = "КомандаСобратьИзИсходниковФайлРасширения"; КлассыРеализацииКоманд[ВозможныеКоманды().ВыгрузитьИнфобазуВФайл] = "КомандаВыгрузитьИнфобазуВФайл"; КлассыРеализацииКоманд[ВозможныеКоманды().ПроверкаСинтаксиса] = "КомандаПроверкаСинтаксиса"; - + КлассыРеализацииКоманд[ВозможныеКоманды().ОбновитьИзХранилища] = "КомандаОбновитьИзХранилища"; КлассыРеализацииКоманд[ВозможныеКоманды().СоздатьХранилище] = "КомандаСоздатьХранилище"; КлассыРеализацииКоманд[ВозможныеКоманды().ПодключитьсяКХранилищу] = "КомандаПодключитьсяКХранилищу"; КлассыРеализацииКоманд[ВозможныеКоманды().СоздатьПользователейХранилища] = "КомандаСоздатьПользователейХранилища"; + КлассыРеализацииКоманд[ВозможныеКоманды().КопироватьПользователейХранилища] = "КомандаКопироватьПользователейХранилища"; КлассыРеализацииКоманд[ВозможныеКоманды().СохранитьВерсиюХранилищаВФайл] = "КомандаСохранитьВерсиюХранилищаВФайл"; КлассыРеализацииКоманд[ВозможныеКоманды().ЗахватитьВХранилище] = "КомандаЗахватитьВХранилище"; КлассыРеализацииКоманд[ВозможныеКоманды().ПоместитьВХранилище] = "КомандаПоместитьВХранилище"; КлассыРеализацииКоманд[ВозможныеКоманды().ОтключитьсяОтХранилища] = "КомандаОтключитьсяОтХранилища"; - + КлассыРеализацииКоманд[ВозможныеКоманды().СобратьИзИсходниковФайлКонфигурации] = "КомандаСобратьИзИсходников"; КлассыРеализацииКоманд[ВозможныеКоманды().РазборкаКонфигурации] = "КомандаРазборкаКонфигурации"; КлассыРеализацииКоманд[ВозможныеКоманды().ЗагрузитьФайлКонфигурации] = "КомандаЗагрузитьФайлКонфигурации"; @@ -140,6 +147,8 @@ КлассыРеализацииКоманд[ВозможныеКоманды().УправлениеСеансами] = "КомандаУправлениеСеансами"; КлассыРеализацииКоманд[ВозможныеКоманды().УправлениеРегламентнымиЗаданиями] = "КомандаУправлениеСеансами"; КлассыРеализацииКоманд[ВозможныеКоманды().ЗапроситьПараметрыБД] = "КомандаУправлениеСеансами"; + + КлассыРеализацииКоманд[ВозможныеКоманды().ПроверкаПроектаEDT] = "КомандаПроверкаПроектаEDT"; //... //КлассыРеализацииКоманд["<имя команды>"] = "<КлассРеализации>"; @@ -147,7 +156,7 @@ // Одна из команд может вызываться неявно, без указания команды. // Иными словами, здесь указывается какой обработчик надо вызывать, если приложение запущено без какой-либо команды -// myapp /home/user/somefile.txt будет аналогично myapp default-action /home/user/somefile.txt +// myapp /home/user/somefile.txt будет аналогично myapp default-action /home/user/somefile.txt Функция ИмяКомандыПоУмолчанию() Экспорт Возврат ВозможныеКоманды().Помощь; КонецФункции @@ -170,11 +179,11 @@ Парсер.ДобавитьИменованныйПараметр("--db-pwd", "Пароль БД", Истина); Парсер.ДобавитьИменованныйПараметр("--v8version", "Версия платформы", Истина); Парсер.ДобавитьИменованныйПараметр("--root", "Полный путь к проекту", Истина); - Парсер.ДобавитьИменованныйПараметр("--ordinaryapp", - "Запуск толстого клиента (1 = толстый, 0 = тонкий клиент, -1 = без указания клиента). По умолчанию используется значение 0 (тонкий клиент). Значение -1 может применяться в случаях, когда нужно прочитать лог работы 1С в режиме Предприятие в управляемом интерфейсе.", + Парсер.ДобавитьИменованныйПараметр("--ordinaryapp", + "Запуск толстого клиента (1 = толстый, 0 = тонкий клиент, -1 = без указания клиента). По умолчанию используется значение 0 (тонкий клиент). Значение -1 может применяться в случаях, когда нужно прочитать лог работы 1С в режиме Предприятие в управляемом интерфейсе.", Истина); - Парсер.ДобавитьПараметрФлаг("--nocacheuse", + Парсер.ДобавитьПараметрФлаг("--nocacheuse", "Признак - не использовать кэш платформы для ускорения операций с базой, |а также не надо добавлять базу в список баз 1C пользователя", Истина); Парсер.ДобавитьИменованныйПараметр("--ibname", "(устарело) Строка подключения к БД", Истина); @@ -182,9 +191,12 @@ Парсер.ДобавитьИменованныйПараметр("--locale", "Код локализации сеанса платформы", Истина); Парсер.ДобавитьИменованныйПараметр("--uccode", "Ключ разрешения запуска", Истина); - + КаталогСценария = (Новый Файл(ТекущийСценарий().Источник)).Путь; ОбщиеМетоды1 = ЗагрузитьСценарий(ОбъединитьПути(КаталогСценария, "ОбщиеМетоды.os")); - Парсер.ДобавитьИменованныйПараметр("--settings", "Путь к файлу настроек, в формате json. По умолчанию имя файла " + + Парсер.ДобавитьИменованныйПараметр("--settings", "Путь к файлу настроек, в формате json. По умолчанию имя файла " + ОбщиеМетоды1.ИмяФайлаНастроек(), Истина); + + Парсер.ДобавитьИменованныйПараметр("--debuglogfile", "Вывод отладочных файлов в указанный лог-файл", Истина); + Парсер.ДобавитьПараметрФлаг("--debuglog", "Вывод отладочных файлов в лог-файл 'vrunner-XXX.log' во временном каталоге пользователя. ", Истина); КонецПроцедуры diff --git a/vanessa-runner-schema.json b/vanessa-runner-schema.json index 9a810e4c..01419e34 100644 --- a/vanessa-runner-schema.json +++ b/vanessa-runner-schema.json @@ -3,6 +3,7 @@ "additionalProperties": false, "definitions": {}, "id": "http://example.com/example.json", + "type": "object", "properties": { "$schema": { "default": "vanessa-runner-schema.json", @@ -56,6 +57,13 @@ "id": "/properties/default/properties/--v8version", "title": "The --v8version Schema", "type": "string" + }, + "--additional": { + "default": "/DisplayAllFunctions /L ru", + "description": "Дополнительные параметры для запуска предприятия.", + "id": "/properties/vanessa/properties/--additional", + "title": "The --additional Schema", + "type": "string" } }, "description": "Общие параметры для запуска всех команд vanessa-runner.", @@ -100,6 +108,27 @@ "id": "/properties/vanessa/properties/--workspace", "title": "The --workspace Schema", "type": "string" + }, + "--db-pwd": { + "default": "", + "description": "Пароль БД.", + "id": "/properties/default/properties/--db-pwd", + "title": "The --db-pwd Schema", + "type": "string" + }, + "--db-user": { + "default": "", + "description": "Пользователь БД.", + "id": "/properties/default/properties/--db-user", + "title": "The --db-user Schema", + "type": "string" + }, + "--ibconnection": { + "default": "/F./build/ib", + "description": "Строка подключения к БД. Например, /F./build/ibservice или /Sserver/name", + "id": "/properties/default/properties/--ibconnection", + "title": "The --ibconnection Schema", + "type": "string" } }, "type": "object" @@ -157,10 +186,30 @@ "id": "/properties/xunit/properties/testsPath", "title": "The Testspath Schema", "type": "string" + }, + "--db-pwd": { + "default": "", + "description": "Пароль БД.", + "id": "/properties/default/properties/--db-pwd", + "title": "The --db-pwd Schema", + "type": "string" + }, + "--db-user": { + "default": "", + "description": "Пользователь БД.", + "id": "/properties/default/properties/--db-user", + "title": "The --db-user Schema", + "type": "string" + }, + "--ibconnection": { + "default": "/F./build/ib", + "description": "Строка подключения к БД. Например, /F./build/ibservice или /Sserver/name", + "id": "/properties/default/properties/--ibconnection", + "title": "The --ibconnection Schema", + "type": "string" } }, "type": "object" } - }, - "type": "object" + } } \ No newline at end of file diff --git a/xunit-schema.json b/xunit-schema.json index f0445f67..aba3205a 100644 --- a/xunit-schema.json +++ b/xunit-schema.json @@ -26,6 +26,15 @@ true ] }, + "ВыводитьСообщенияВЖурналРегистрации": { + "$id": "/properties/smoke/properties/ВыводитьСообщенияВЖурналРегистрации", + "type": "boolean", + "title": "The ВыводитьСообщенияВЖурналРегистрации Schema ", + "default": true, + "examples": [ + true + ] + }, "ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций": { "$id": "/properties/smoke/properties/ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций", "type": "boolean", @@ -230,6 +239,22 @@ "ВыполнениеЗапросов.Форма.ФормаВыполнения" ] } + }, + "ПропускаемыеИсключения": { + "$id": "/properties/smoke/properties/ПропускаемыеИсключения", + "type": [ + "object" + ], + "items": { + "$id": "/properties/smoke/properties/ПропускаемыеИсключения/items", + "type": "string", + "title": "The 0th Schema ", + "default": "", + "examples": [ + "ВыполнениеЗапросов", + "ВыполнениеЗапросов.Форма.ФормаВыполнения" + ] + } } } }, @@ -264,6 +289,15 @@ "./build/ServiceBases/log-xunit.txt", "c:/build/ServiceBases/log-xunit.txt" ] + }, + "ДобавлятьИмяПользователяВПредставлениеТеста": { + "$id": "/properties/smoke/properties/ДобавлятьИмяПользователяВПредставлениеТеста", + "type": "boolean", + "title": "The ДобавлятьИмяПользователяВПредставлениеТеста Schema ", + "default": false, + "examples": [ + true + ] } } } \ No newline at end of file