diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml new file mode 100644 index 0000000..44d8608 --- /dev/null +++ b/.github/workflows/qa.yml @@ -0,0 +1,74 @@ +# MIT License +# Copyright (C) 2020 Tymko Oleg and contributors +# All rights reserved. + +name: Контроль качества +# Любой пуш и pr в проекте но с фильтром по основному проекту +on: [push, pull_request] +jobs: + build: + if: github.repository == 'autumn-library/winow-cli' + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + oscript_version: ['stable'] + + steps: + # Загрузка проекта + - name: Актуализация + uses: actions/checkout@v2 + + # Вычисление имени ветки + - name: Compute branch name + uses: nelonoel/branch-name@v1.0.1 + + # Установка OneScript конкретной версии + - name: Установка OneScript + uses: otymko/setup-onescript@v1.1 + with: + version: ${{ matrix.oscript_version }} + + # Установка зависимостей пакета + - name: Установка зависимостей + run: | + opm install opm + opm install -l --dev + + # Запуск тестов и сбор покрытия кода + - name: Покрытие кода + run: oscript ./tasks/coverage.os + + - name: Извлечение версии пакета + shell: bash + run: echo "##[set-output name=version;]`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'`" + id: extract_version + + - name: Setup sonarqube + uses: warchant/setup-sonar-scanner@v3 + + # Анализ проекта в SonarQube (ветка) + - name: Анализ в SonarQube (branch) + if: github.event_name == 'push' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: sonar-scanner + -Dsonar.host.url=https://sonar.openbsl.ru + -Dsonar.branch.name=${{ env.BRANCH_NAME }} + -Dsonar.projectVersion=${{ steps.extract_version.outputs.version }} + + # Анализ проекта в SonarQube (PR) + # https://docs.sonarqube.org/latest/analysis/pull-request/ + - name: Анализ в SonarQube (pull-request) + if: github.event_name == 'pull_request' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: sonar-scanner + -Dsonar.host.url=https://sonar.openbsl.ru + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} + -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} + -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} + -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..635bf4a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,15 @@ +name: Публикация релиза + +on: + release: + types: + - published + workflow_dispatch: + +jobs: + release: + uses: autumn-library/workflows/.github/workflows/release.yml@main + with: + package_mask: "winow-cli-*.ospx" + secrets: + PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..2a82211 --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,37 @@ +# MIT License +# Copyright (C) 2020 Tymko Oleg and contributors +# All rights reserved. + +name: Тестирование +# Любой пуш и pr в проекте +on: [push, pull_request] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ['ubuntu-latest', 'macos-latest', 'windows-latest'] + oscript_version: ['dev', 'stable'] + + steps: + # Загрузка проекта + - name: Актуализация + uses: actions/checkout@v2 + + # Установка OneScript конкретной версии + - name: Установка OneScript + uses: otymko/setup-onescript@v1.3 + with: + version: ${{ matrix.oscript_version }} + + # Установка зависимостей пакета + - name: Установка зависимостей + run: | + opm install opm + opm install -l --dev + + # Задача тестирования, в результате ожидается успешное выполнение + - name: Тестирование + run: oscript ./tasks/test.os diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d73316 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.vscode +.DS_Store +*.ospx +out/ +oscript_modules/ +tests/tmp diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/packagedef b/packagedef new file mode 100644 index 0000000..07c2b55 --- /dev/null +++ b/packagedef @@ -0,0 +1,24 @@ + +Описание.Имя("winow-cli") + .Версия("1.0.0") + .Автор("Никита Иванченко") + .АдресАвтора("https://github.com/Nivanchenko") + .Описание("Консольная утилита для управления сервером winow") + .ВерсияСреды("1.9.0") + .ВключитьФайл("src") + .ВключитьФайл("packagedef") + .ВключитьФайл("lib.config") + .ВключитьФайл("README.md") + .ВключитьФайл("package-loader.os") + .ЗависитОт("asserts", "1.4.0") + .ЗависитОт("autumn", "4.0.0") + .ЗависитОт("autumn-cli", "1.0.6") + .ЗависитОт("json") + .ЗависитОт("autumn-logos", "1.2.0") + .ЗависитОт("fs") + .ЗависитОт("winow", "0.7.0") + .РазработкаЗависитОт("1commands") + .РазработкаЗависитОт("1testrunner") + .РазработкаЗависитОт("coverage") + .ИсполняемыйФайл("src/main.os", "winow-cli") + ; diff --git a/src/main.os b/src/main.os new file mode 100644 index 0000000..1a73c9b --- /dev/null +++ b/src/main.os @@ -0,0 +1,7 @@ +#Использовать autumn +#Использовать autumn-cli +#Использовать autumn-logos +#Использовать ".." + +Поделка = Новый Поделка; +Поделка.ЗапуститьПриложение(); \ No newline at end of file diff --git a/src/templates/about.html b/src/templates/about.html new file mode 100644 index 0000000..0684188 --- /dev/null +++ b/src/templates/about.html @@ -0,0 +1,11 @@ +
+
Вино и желуди
+ WINOW - это тебе не OneScript.WEB +
+ А так же стоит посмотреть на Библиотеки: + +
\ No newline at end of file diff --git a/src/templates/autumn-properties.json b/src/templates/autumn-properties.json new file mode 100644 index 0000000..5db6ec3 --- /dev/null +++ b/src/templates/autumn-properties.json @@ -0,0 +1,12 @@ +{ "winow": + { + "КаталогСПриложениями": "./controls", + "АвтоСтарт": false, + "Порт": 3333, + "ИмяХоста": "localhost", + "ЗадержкаПередЧтениемСокета": 65, + "КаталогиСФайлами": { + "/files": "./files" + } + } +} \ No newline at end of file diff --git a/src/templates/contact.html b/src/templates/contact.html new file mode 100644 index 0000000..d2e9595 --- /dev/null +++ b/src/templates/contact.html @@ -0,0 +1,3 @@ +
+ Все о наших репозиториях можно найти ТУТ +
\ No newline at end of file diff --git a/src/templates/index.html b/src/templates/index.html new file mode 100644 index 0000000..36d0aed --- /dev/null +++ b/src/templates/index.html @@ -0,0 +1,7 @@ +
+ Привет, ты на стартовой странице WINOW +
+ Точное серверное время: {{ТекущаяДата()}} +
+ Наилучшие пожелания от {{Модель.АвторПожелания}} +
\ No newline at end of file diff --git a/src/templates/launch.json b/src/templates/launch.json new file mode 100644 index 0000000..7410933 --- /dev/null +++ b/src/templates/launch.json @@ -0,0 +1,20 @@ +{ + // Используйте IntelliSense, чтобы узнать о возможных атрибутах. + // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов. + // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Отладка 1Script", + "type": "oscript", + "request": "launch", + "program": "${workspaceRoot}/ОтладкаПриложения.os", + "args": [], + "cwd": "${workspaceRoot}", + "env": {}, + "runtimeExecutable": %1, + "runtimeArgs": [], + "debugPort": 2801 + } + ] +} \ No newline at end of file diff --git a/src/templates/main.html b/src/templates/main.html new file mode 100644 index 0000000..455c949 --- /dev/null +++ b/src/templates/main.html @@ -0,0 +1,50 @@ + + + +{{Модель.Заголовок}} + + + + + + + + +
+@Контент +
+ + \ No newline at end of file diff --git a/src/templates/wine_and_acorns.jpg b/src/templates/wine_and_acorns.jpg new file mode 100644 index 0000000..99a8308 Binary files /dev/null and b/src/templates/wine_and_acorns.jpg differ diff --git "a/src/templates/\320\236\321\201\320\275\320\276\320\262\320\275\320\276\320\271\320\232\320\276\320\275\321\202\321\200\320\276\320\273.os" "b/src/templates/\320\236\321\201\320\275\320\276\320\262\320\275\320\276\320\271\320\232\320\276\320\275\321\202\321\200\320\276\320\273.os" new file mode 100644 index 0000000..d4f20bb --- /dev/null +++ "b/src/templates/\320\236\321\201\320\275\320\276\320\262\320\275\320\276\320\271\320\232\320\276\320\275\321\202\321\200\320\276\320\273.os" @@ -0,0 +1,38 @@ +&Пластилин Перем МенеджерОтображений Экспорт; + +&Контроллер("/") +&Отображение(Шаблон = "./view/main.html", Метод = "ПолучитьМодельКонтрола") +Процедура ПриСозданииОбъекта() + +КонецПроцедуры + +Функция ПолучитьМодельКонтрола() Экспорт + Модель = Новый Структура("Заголовок", "Минималистичный веб сервер WINOW"); + + Возврат Модель; +КонецФункции + +&ТочкаМаршрута("") +&Отображение("./view/index.html") +Процедура Главная(Ответ) Экспорт + Ответ.Модель = Новый Структура("АвторПожелания", "сервер WINOW"); +КонецПроцедуры + +&ТочкаМаршрута("about") +&Отображение("./view/about.html") +Процедура ОСебе(Ответ) Экспорт + Библиотеки = Новый Массив; + Библиотеки.Добавить(Новый Структура("Имя, Адрес", "autumn","https://github.com/autumn-library/autumn")); + Библиотеки.Добавить(Новый Структура("Имя, Адрес", "autumn-dduck ","https://github.com/autumn-library/autumn-dduck")); + Библиотеки.Добавить(Новый Структура("Имя, Адрес", "autumn-killjoy-flavour ","https://github.com/autumn-library/autumn-killjoy-flavour")); + Библиотеки.Добавить(Новый Структура("Имя, Адрес", "autumn-logos ","https://github.com/autumn-library/autumn-logos")); + Библиотеки.Добавить(Новый Структура("Имя, Адрес", "autumn-cli ","https://github.com/autumn-library/autumn-cli")); + + Ответ.Модель = Новый Структура("Библиотеки", Библиотеки); +КонецПроцедуры + +&ТочкаМаршрута("contact") +&Отображение("./view/contact.html") +Процедура Контакты() Экспорт + +КонецПроцедуры \ No newline at end of file diff --git "a/src/templates/\320\236\321\202\320\273\320\260\320\264\320\272\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/templates/\320\236\321\202\320\273\320\260\320\264\320\272\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" new file mode 100644 index 0000000..0fedaad --- /dev/null +++ "b/src/templates/\320\236\321\202\320\273\320\260\320\264\320\272\320\260\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -0,0 +1,8 @@ +#Использовать autumn +#Использовать autumn-logos +#Использовать winow + +Поделка = Новый Поделка; +Поделка.ЗапуститьПриложение(); +ЗапускательВебПриложения = Поделка.НайтиЖелудь("ЗапускательВебПриложения"); +ЗапускательВебПриложения.Запустить(); \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\320\227\320\260\320\277\321\203\321\201\320\272\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\320\227\320\260\320\277\321\203\321\201\320\272\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\260.os" new file mode 100644 index 0000000..6a2569e --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\320\227\320\260\320\277\321\203\321\201\320\272\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\260.os" @@ -0,0 +1,11 @@ +&Пластилин +Перем ЗапускательВебПриложения; + +&КомандаПриложения(Имя = "start", Описание = "Запуск сервера") +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ВыполнениеКоманды +Процедура Запустить() Экспорт + ЗапускательВебПриложения.Запустить(); +КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\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\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\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\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" new file mode 100644 index 0000000..c5cfa95 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\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\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" @@ -0,0 +1,16 @@ +&Аргумент(Имя = "PATH", Описание = "Относительный путь инициализации, текущий каталог <.> (точка)") +&ТСтрока +&ПоУмолчанию(".") +Перем Путь; + +&Пластилин +Перем КонструкторВебПриложений; + +&КомандаПриложения(Имя = "init", Описание = "Инициализация нового приложения") +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&ВыполнениеКоманды +Процедура Запустить() Экспорт + КонструкторВебПриложений.ПроинициализироватьКаталог(Путь); +КонецПроцедуры \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\260.os" new file mode 100644 index 0000000..f0a6444 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/cli_\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217\320\222\320\265\320\261\320\241\320\265\321\200\320\262\320\265\321\200\320\260.os" @@ -0,0 +1,17 @@ + +&Желудь("ОписаниеКонсольногоПриложения") +&Верховный +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +Функция ИмяПриложения() Экспорт + Возврат "winow-cli"; +КонецФункции + +Функция ПолноеИмяПриложения() Экспорт + Возврат "Управление сервером winow"; +КонецФункции + +Функция ВерсияПриложения() Экспорт + Возврат "1.0.0"; +КонецФункции diff --git a/tasks/coverage.os b/tasks/coverage.os new file mode 100644 index 0000000..fe41290 --- /dev/null +++ b/tasks/coverage.os @@ -0,0 +1,31 @@ +#Использовать 1commands +#Использовать fs +#Использовать coverage + +СистемнаяИнформация = Новый СистемнаяИнформация; +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + +ФС.ОбеспечитьПустойКаталог("out"); +ПутьКСтат = "out/stat.json"; + +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); +Если НЕ ЭтоWindows Тогда + Команда.ДобавитьПараметр("-encoding=utf-8"); +КонецЕсли; +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр("tasks/test.os"); // Файла запуска тестов +Команда.ПоказыватьВыводНемедленно(Истина); + +КодВозврата = Команда.Исполнить(); + +ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); + +ПроцессорГенерации.ОтносительныеПути() + .РабочийКаталог("out") + .ИмяФайлаСтатистики() + .GenericCoverage() + .Cobertura() + .Сформировать(); + +ЗавершитьРаботу(КодВозврата); diff --git a/tasks/oscript.cfg b/tasks/oscript.cfg new file mode 100644 index 0000000..874f3d2 --- /dev/null +++ b/tasks/oscript.cfg @@ -0,0 +1 @@ +lib.system=../oscript_modules diff --git a/tasks/test.os b/tasks/test.os new file mode 100644 index 0000000..9148784 --- /dev/null +++ b/tasks/test.os @@ -0,0 +1,42 @@ +#Использовать 1testrunner +#Использовать fs + +Функция ПрогнатьТесты() + + Тестер = Новый Тестер; + Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); + + ПутьКТестам = "tests"; + ПутьКОтчетуJUnit = "out"; + + ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit); + + РезультатТестирования = Тестер.ТестироватьКаталог( + Новый Файл(ПутьКТестам), + Новый Файл(ПутьКОтчетуJUnit) + ); + + Успешно = РезультатТестирования = 0; + + Возврат Успешно; +КонецФункции // ПрогнатьТесты() +// основной код + +ТекКаталог = ТекущийКаталог(); + +Попытка + ТестыПрошли = ПрогнатьТесты(); +Исключение + ТестыПрошли = Ложь; + Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; + +УстановитьТекущийКаталог(ТекКаталог); + +Если Не ТестыПрошли Тогда + ВызватьИсключение "Тестирование завершилось неудачно!"; +Иначе + Сообщить(СтрШаблон("Результат прогона тестов <%1> + |", ТестыПрошли)); +КонецЕсли; diff --git a/tests/constructor.os b/tests/constructor.os new file mode 100644 index 0000000..da89322 --- /dev/null +++ b/tests/constructor.os @@ -0,0 +1,45 @@ +#Использовать autumn +#Использовать ".." +#Использовать asserts +#Использовать fs + +Перем ТекущийКаталог; + +Процедура ПередЗапускомТеста() Экспорт + ТекущийКаталог = ТекущийКаталог(); + КаталогИнициализацииПриложения = "tests/tmp"; + ФС.ОбеспечитьПустойКаталог(КаталогИнициализацииПриложения); + УстановитьТекущийКаталог(ОбъединитьПути(ТекущийКаталог(), КаталогИнициализацииПриложения)); +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + УстановитьТекущийКаталог(ТекущийКаталог); +КонецПроцедуры + +&Тест +Процедура ИнициализацияКаталогаПриложения() Экспорт + + // Дано + ФС.ОбеспечитьПустойКаталог("testapp"); + Поделка = Новый Поделка(); + Поделка.ЗапуститьПриложение(); + КонструкторВебПриложений = Поделка.НайтиЖелудь("КонструкторВебПриложений"); + + // Когда + КонструкторВебПриложений.ПроинициализироватьКаталог("testapp"); + + // Тогда + Ожидаем.Что(ФС.ФайлСуществует("testapp/autumn-properties.json")).Равно(Истина); + Ожидаем.Что(ФС.КаталогСуществует("testapp/controls")).Равно(Истина); + Ожидаем.Что(ФС.КаталогСуществует("testapp/files")).Равно(Истина); + Ожидаем.Что(ФС.КаталогСуществует("testapp/view")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/controls/ОсновнойКонтрол.os")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/view/about.html")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/view/contact.html")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/view/index.html")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/view/main.html")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/files/wine_and_acorns.jpg")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/.vscode/launch.json")).Равно(Истина); + Ожидаем.Что(ФС.ФайлСуществует("testapp/ОтладкаПриложения.os")).Равно(Истина); + +КонецПроцедуры \ No newline at end of file