diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f59923e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +exec.log diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 317e87c..2634640 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,7 +2,8 @@ "version": "0.1.0", "windows": { "command": "cmd", - "args": ["/c"] + // "args": ["/c"] + "args": ["/c", "chcp 65001 >nul &"] }, "linux": { "command": "sh", @@ -38,7 +39,7 @@ "args": [ "1testrunner", "-run", - "${file}", + "${file}" ], "echoCommand": true, "showOutput": "always", diff --git a/appveyor-runtests.cmd b/appveyor-runtests.cmd new file mode 100644 index 0000000..2887ea0 --- /dev/null +++ b/appveyor-runtests.cmd @@ -0,0 +1,24 @@ +@echo on +@chcp 65001 + +set OSCRIPT=%ProgramFiles(x86)%\OneScript + +@echo . +@echo ======================= ======================= ======================= ======================= +@echo . +@echo . + +call 1bdd features -junit-out ./bdd-log.xml + +@if %ERRORLEVEL%==2 GOTO good_exit_bdd +@if %ERRORLEVEL%==0 GOTO good_exit_bdd + +dir .\tests\ + +exit /B 1 + +:good_exit_bdd + +dir .\tests\ + +exit /B 0 diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..1ea2325 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,73 @@ +version: 1.2.{build} +pull_requests: + do_not_increment_build_number: true +max_jobs: 1 +init: +- ps: Set-WinSystemLocale ru-RU + +# appveyor DownloadFile http://oscript.io/downloads/latest/exe -FileName ./oscriptlatest.exe +# dir /w +# oscriptlatest.exe /VERYSILENT /DIR=".\engine\" +# SET PATH=%CD%\engine\bin;%PATH% +# oscript + +install: +- cmd: >- + @echo on + + git submodule update --init --recursive + + set + + curl -o %temp%\oscript-setup.exe http://oscript.io/downloads/latest/exe + + %temp%\oscript-setup.exe /silent /log="%temp%\oscript-setup.log" /saveinf="%temp%\oscript-setup-settings.txt" + + set OSCRIPT=%ProgramFiles(x86)%\OneScript + + dir "%OSCRIPT%\bin" + dir "%OSCRIPT%\lib" + + rem SET PATH=%CD%\engine\bin;%PATH% + + SET PATH=%OSCRIPT%\bin;%PATH% + + where oscript + + oscript -version + + chcp 65001 + + opm install opm + + opm list + + opm install 1testrunner + + opm install 1commands + + opm install 1bdd + + opm list + + dir "%OSCRIPT%\bin" + dir "%OSCRIPT%\lib" + +# to disable automatic builds +build: off +test_script: +- cmd: >- + + appveyor-runtests.cmd + + pushd %APPVEYOR_BUILD_FOLDER% + +after_test: +- ps: # upload results to AppVeyor +- ps: Write-Host "Загружаю результаты тестов на CI" +- ps: $wc = New-Object 'System.Net.WebClient' +# - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\tests\tests.xml)) +- ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\bdd-log.xml)) +artifacts: +# - path: tests\tests.xml +- path: .\bdd-log.xml \ No newline at end of file diff --git "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" new file mode 100644 index 0000000..afe591f --- /dev/null +++ "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -0,0 +1,103 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd +#Использовать "../.." + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯВыполняюКомандуЧерезКомандныйПроцессорСистемы"); + ВсеШаги.Добавить("ЯВыполняюКомандуБезКомандногоПроцессораСистемы"); + ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйКодВозвратаДляКоманды"); + ВсеШаги.Добавить("ЯПолучаюИсключениеПриВыполненииКоманды"); + ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// TODO перенести методы (2 шт) в 1bdd для исключения дублирования + +//Я выполняю команду "oscript" через командный процессор системы +Процедура ЯВыполняюКомандуЧерезКомандныйПроцессорСистемы(Знач ИмяИлиТекстКоманды) Экспорт + ВыполнитьКоманду(ИмяИлиТекстКоманды, Истина); +КонецПроцедуры + +//Я выполняю команду "oscript" без командного процессора системы +Процедура ЯВыполняюКомандуБезКомандногоПроцессораСистемы(Знач ИмяИлиТекстКоманды) Экспорт + ВыполнитьКоманду(ИмяИлиТекстКоманды, Ложь); +КонецПроцедуры + +//Я устанавливаю ожидаемый код возврата 0 для команды "oscript" +Процедура ЯУстанавливаюОжидаемыйКодВозвратаДляКоманды(Знач ОжидаемыйКодВозврата, Знач ИмяИлиТекстКоманды) Экспорт + Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды); + + Команда.УстановитьПравильныйКодВозврата(ОжидаемыйКодВозврата); +КонецПроцедуры + +//Я устанавливаю ожидаемый диапазон кодов возврата от 0 до 10 для команды "oscript" +Процедура ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды(Знач МинимальныйОжидаемыйКодВозврата, + Знач МаксимальныйОжидаемыйКодВозврата, Знач ИмяИлиТекстКоманды) Экспорт + + Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды); + + Команда.УстановитьДиапазонПравильныхКодовВозврата( + МинимальныйОжидаемыйКодВозврата, + МаксимальныйОжидаемыйКодВозврата); +КонецПроцедуры + +//Я получаю исключение при выполнении команды "oscript" +Процедура ЯПолучаюИсключениеПриВыполненииКоманды(Знач ИмяИлиТекстКоманды) Экспорт + Попытка + ВыполнитьКоманду(ИмяИлиТекстКоманды, Истина); + Исключение + Возврат; + КонецПопытки; + + ВызватьИсключение СтрШаблон("Не получили исключение при выполнении команды", ИмяИлиТекстКоманды); +КонецПроцедуры + + +// { Служебные функции + +Процедура ВыполнитьКоманду(Знач ИмяИлиТекстКоманды, Знач ИспользуемКомандныйПроцессор = Истина) + Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды); + Команда.УстановитьИсполнениеЧерезКомандыСистемы(ИспользуемКомандныйПроцессор); + + Команда.Исполнить(); +КонецПроцедуры + +//TODO дубль кода с 1bdd::ВыполнениеКоманд.os +Функция ПолучитьКомандуИзКонтекста(Знач ИмяКоманды) + + КлючКонтекста = КлючКоманды(ИмяКоманды); + Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста); + + Если Не ЗначениеЗаполнено(Команда) Тогда + Команда = Новый Команда; + Команда.УстановитьКоманду(ИмяКоманды); + БДД.СохранитьВКонтекст(КлючКонтекста, Команда); + КонецЕсли; + + Возврат Команда; +КонецФункции + +Функция КлючКоманды(Знач ИмяКоманды) + Возврат "Команда-" + ИмяКоманды; +КонецФункции + +//} diff --git "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" index 41d5205..092531c 100644 --- "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" +++ "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" @@ -7,7 +7,7 @@ Чтобы я мог проще автоматизировать больше действий на OneScript Контекст: Отключение отладки в логах - Допустим Я выключаю отладку лога с именем "oscript.lib.commands" + Допустим Я включаю отладку лога с именем "oscript.lib.commands" Сценарий: Выполнение команды без параметров Когда Я выполняю команду "git" @@ -20,3 +20,33 @@ Тогда Я сообщаю вывод команды "git" И Вывод команды "git" содержит "version" И Код возврата команды "git" равен 0 + +Сценарий: Выполнение команды через командный процессор системы + Когда Я выполняю команду "oscript" через командный процессор системы + Тогда Вывод команды "oscript" содержит "1Script Execution Engine" + И Код возврата команды "oscript" равен 0 + +Сценарий: Выполнение команды без командного процессора системы + Когда Я выполняю команду "oscript" без командного процессора системы + Тогда Вывод команды "oscript" содержит "1Script Execution Engine" + И Код возврата команды "oscript" равен 0 + +Сценарий: Проверка правильного кода возврата команды + Когда Я устанавливаю ожидаемый код возврата 0 для команды "oscript" + Когда Я выполняю команду "oscript" + Тогда Код возврата команды "oscript" равен 0 + +Сценарий: Проверка неправильного кода возврата команды + Когда Я устанавливаю ожидаемый код возврата 123 для команды "oscript" + Тогда Я получаю исключение при выполнении команды "oscript" + И Код возврата команды "oscript" равен 0 + +Сценарий: Проверка правильного диапазона кодов возврата команды + Когда Я устанавливаю ожидаемый диапазон кодов возврата от 0 до 10 для команды "oscript" + Когда Я выполняю команду "oscript" + Тогда Код возврата команды "oscript" равен 0 + +Сценарий: Проверка неправильного диапазона кодов возврата команды + Когда Я устанавливаю ожидаемый диапазон кодов возврата от 1 до 10 для команды "oscript" + Тогда Я получаю исключение при выполнении команды "oscript" + И Код возврата команды "oscript" равен 0 diff --git "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" index ae44b51..2bf631f 100644 --- "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" +++ "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" @@ -13,6 +13,7 @@ Когда Я создаю командный файл И Я добавляю строку "chcp 1251" в командный файл И Я добавляю строку "echo командный файл" в командный файл + И Я добавляю строку "chcp 866" в командный файл И Я сообщаю содержимое командного файла И Я выполняю командный файл Тогда Вывод командного файла содержит "командный файл" diff --git a/packagedef b/packagedef index f645158..b883086 100644 --- a/packagedef +++ b/packagedef @@ -1,9 +1,13 @@  Описание.Имя("1commands") - .Версия("0.7") + .Версия("0.8") .ЗависитОт("logos") .ЗависитОт("asserts") .ЗависитОт("tempfiles") .ВключитьФайл("src") .ВключитьФайл("features") + .ВключитьФайл(".vscode") + .ВключитьФайл("readme.md") + .ВключитьФайл("LICENSE.md") + .ВключитьФайл("NOTICE") .ВключитьФайл("lib.config"); diff --git a/readme.md b/readme.md index 38368d5..5a5d9ce 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,7 @@ # 1commands Обсудить [![Join the chat at https://gitter.im/EvilBeaver/oscript-library](https://badges.gitter.im/EvilBeaver/oscript-library.svg)](https://gitter.im/EvilBeaver/oscript-library?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GitHub release](https://img.shields.io/github/release/artbear/1commands.svg)](https://github.com/artbear/1commands/releases) +[![Build status](https://ci.appveyor.com/api/projects/status/ervidk37h9m0tgs5?svg=true)](https://ci.appveyor.com/project/artbear/1commands) ## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash) из oscript. diff --git "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" index eecbe9d..a5ea98a 100644 --- "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" +++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" @@ -11,6 +11,10 @@ Перем ВыводКоманды; Перем КодировкаВывода; Перем КодВозврата; +Перем ИспользуемКомандныйПроцессор; +Перем ПроверяемКодВозврата; +Перем МинимальныйОжидаемыйКодВозврата; +Перем МаксимальныйОжидаемыйКодВозврата; Перем ЭтоWindows; Перем Лог; @@ -30,6 +34,15 @@ КонецФункции +// Получить имя лога продукта +// +// Возвращаемое значение: +// Строка - имя лога продукта +// +Функция ИмяЛога() Экспорт + Возврат "oscript.lib.commands"; +КонецФункции + // Установить путь команды. // Если в пути команды есть пробелы, они обрамляются кавычками // ВАЖНО: метод принимает именно путь к приложению, @@ -103,10 +116,37 @@ Возврат КодВозврата; КонецФункции +// Установить ожидаемый код возврата +// После исполнения команды будет выброшено исключение, если полученный код возврата не совпадает с ожидаемым +// +// Параметры: +// ОжидаемыйКодВозврата - Число +// +Процедура УстановитьПравильныйКодВозврата(Знач ПарамОжидаемыйКодВозврата) Экспорт + УстановитьДиапазонПравильныхКодовВозврата(ПарамОжидаемыйКодВозврата, ПарамОжидаемыйКодВозврата); +КонецПроцедуры + +// Установить диапазон ожидаемых кодов возврата +// После исполнения команды будет выброшено исключение, если полученный код возврата не попадает в указанный диапазон +// +// Параметры: +// МинимальныйОжидаемыйКодВозврата - Число +// МаксимальныйОжидаемыйКодВозврата - Число +// +Процедура УстановитьДиапазонПравильныхКодовВозврата( Знач ПарамМинимальныйОжидаемыйКодВозврата, + Знач ПарамМаксимальныйОжидаемыйКодВозврата) Экспорт + + ПроверяемКодВозврата = Истина; + МинимальныйОжидаемыйКодВозврата = ПарамМинимальныйОжидаемыйКодВозврата; + МаксимальныйОжидаемыйКодВозврата = ПарамМаксимальныйОжидаемыйКодВозврата; + +КонецПроцедуры + // Установить кодировку вывода для выполнения команды. // // Параметры: -// Строка - кодировка вывода +// Строка, Неопределено - кодировка вывода +// Если Неопределено, кодировка сбрасывается и используется значение по умолчанию от операционной системы // Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт КодировкаВывода = НоваяКодировкаВывода; @@ -139,6 +179,16 @@ Возврат РабочийКаталог; КонецФункции +// Установить признак исполнения через командный процессор системы. +// По умолчанию он включен. +// +// Параметры: +// ИспользуемКомандныйПроцессор - Булево - Включить/Выключить использование командного процессора системы. +// +Процедура УстановитьИсполнениеЧерезКомандыСистемы(Знач ПарамИспользуемКомандныйПроцессор) Экспорт + ИспользуемКомандныйПроцессор = ПарамИспользуемКомандныйПроцессор; +КонецПроцедуры + // Оборачивает переданную строку в кавычки, если она еще не обернута. // // Параметры: @@ -205,32 +255,60 @@ КонецЦикла; - // Приложение = ПутьПриложения; Если НЕ ИспользуетсяЕдинаяСтрокаЗапуска И Найти(ПутьПриложения, " ") > 0 Тогда ПутьПриложения = ОбернутьВКавычки(ПутьПриложения); КонецЕсли; Лог.Отладка("СтрокаЗапуска <%1>", ПутьПриложения + СтрокаДляЛога); - // Если ЭтоWindows = Ложь Тогда - // СтрокаЗапуска = "sh -c '" + ПутьПриложения + СтрокаЗапуска + "'"; - // Иначе - СтрокаЗапуска = ПутьПриложения + СтрокаЗапуска; - // КонецЕсли; + СтрокаЗапуска = ПутьПриложения + СтрокаЗапуска; + + Если ИспользуемКомандныйПроцессор Тогда + Если ЭтоWindows Тогда + ШаблонЗапуска = "cmd /c %1"; + Иначе + ШаблонЗапуска = "sh -c '%1'"; + КонецЕсли; + + СтрокаЗапуска = СтрШаблон(ШаблонЗапуска, СтрокаЗапуска); + КонецЕсли; ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); - - Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, Истина, Истина, КодировкаВывода); + + Если КодировкаВывода = Неопределено Тогда + Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, Истина, Истина); + Иначе + Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, Истина, Истина, КодировкаВывода); + КонецЕсли; Процесс.Запустить(); Пока НЕ Процесс.Завершен ИЛИ Процесс.ПотокВывода.ЕстьДанные Цикл - СтрокаВывода = "" + Процесс.ПотокВывода.ПрочитатьСтроку() + Символы.ПС; + ОчереднаяСтрокаВывода = Процесс.ПотокВывода.ПрочитатьСтроку(); + Лог.Отладка(" %1", ОчереднаяСтрокаВывода); + + СтрокаВывода = "" + ОчереднаяСтрокаВывода + Символы.ПС; ЗаписьXML.ЗаписатьБезОбработки(СтрокаВывода); КонецЦикла; РезультатРаботыПроцесса = ЗаписьXML.Закрыть(); УстановитьВывод(РезультатРаботыПроцесса); - + + КодВозврата = Процесс.КодВозврата; + Если ПроверяемКодВозврата Тогда + Если КодВозврата < МинимальныйОжидаемыйКодВозврата или КодВозврата > МаксимальныйОжидаемыйКодВозврата Тогда + Если МинимальныйОжидаемыйКодВозврата <> МаксимальныйОжидаемыйКодВозврата Тогда + ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так", + КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата); + Иначе + ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так", + КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата); + КонецЕсли; + Ожидаем.Что(КодВозврата, ТекстОшибки). + БольшеИлиРавно(МинимальныйОжидаемыйКодВозврата). + МеньшеИлиРавно(МаксимальныйОжидаемыйКодВозврата); + КонецЕсли; + КонецЕсли; + Возврат Процесс.КодВозврата; КонецФункции @@ -240,17 +318,21 @@ // Процедура Инициализация() - Лог = Логирование.ПолучитьЛог("oscript.lib.commands"); + Лог = Логирование.ПолучитьЛог(ИмяЛога()); СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; РабочийКаталог = "."; ВыводКоманды = ""; - КодировкаВывода = КодировкаТекста.UTF8; + КодировкаВывода = Неопределено; //КодировкаТекста.UTF8; Параметры = Новый Массив; ИспользуетсяЕдинаяСтрокаЗапуска = Ложь; + ИспользуемКомандныйПроцессор = Истина; + + ПроверяемКодВозврата = Ложь; + ОжидаемыйКодВозврата = 0; КонецПроцедуры diff --git "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" index 4a6189e..43428ac 100644 --- "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" @@ -11,6 +11,15 @@ Перем ЭтоWindows; Перем Лог; +// Получить имя лога продукта +// +// Возвращаемое значение: +// Строка - имя лога продукта +// +Функция ИмяЛога() Экспорт + Возврат "oscript.lib.commands"; +КонецФункции + // Получить путь командного файла // // Возвращаемое значение: @@ -168,7 +177,7 @@ // Процедура Инициализация() - Лог = Логирование.ПолучитьЛог("oscript.lib.commands"); + Лог = Логирование.ПолучитьЛог(ИмяЛога()); СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;