diff --git a/.gitignore b/.gitignore index 39ba85f..cd2f1cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,12 @@ exec.log test-reports/*.* *.ospx -bin/* \ No newline at end of file +bin/* +test*.xml +bdd-*.xml + +*.ospx + +coverage/* + +.vscode/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 6385d1a..3e4013e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,62 +1,79 @@ -sudo: required +language: generic -dist: trusty +sudo: required notifications: email: false - -before_install: - - if [ $TRAVIS_OS_NAME == "linux" ]; then - export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0; - sh -e /etc/init.d/xvfb start; - sleep 3; - fi - - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF - - echo "deb http://download.mono-project.com/repo/ubuntu trusty main" | sudo tee /etc/apt/sources.list.d/mono-official.list - - sudo apt-get update - - sudo apt-get install mono-complete mono-devel - - wget -O os.deb http://oscript.io/downloads/latest/onescript-engine_1.0.18_all.deb - - sudo dpkg -i *.deb; sudo apt install -f - - sudo oscript /usr/share/oscript/lib/opm/src/opm.os install opm - -install: - - sudo oscript /usr/share/oscript/lib/opm/src/opm.os install 1testrunner - - sudo oscript /usr/share/oscript/lib/opm/src/opm.os install 1bdd - - sudo oscript /usr/share/oscript/lib/opm/src/opm.os install + +services: + - docker + +addons: + sonarqube: true + +before_install: + # Load cached docker images + - if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi + +before_cache: + # Save tagged docker images + - > + mkdir -p $HOME/docker && docker images -a --filter='dangling=false' --format '{{.Repository}}:{{.Tag}} {{.ID}}' + | xargs -n 2 -t sh -c 'test -e $HOME/docker/$1.tar.gz || docker save $0 | gzip -2 > $HOME/docker/$1.tar.gz' + +install: + - docker pull harmit/ci-image env: global: - - CHANNEL=dev - + - CHANNEL=dev + - PACKAGE_NAME=v8storage + matrix: + - OSCRIPT_VERSION=1_0_19 + - OSCRIPT_VERSION=1_0_20 + - OSCRIPT_VERSION=night-build +matrix: + allow_failures: + - env: OSCRIPT_VERSION=night-build cache: directories: - '$HOME/.m2/repository' - '$HOME/.sonar/cache' + - '$HOME/docker' + +script: + - docker version + - docker run -it -e OSCRIPT_VERSION=$OSCRIPT_VERSION -v $(pwd):/work_dir harmit/ci-image sh -c 'cd /work_dir; sh /work_dir/travis-ci.sh; exit' | tee /tmp/test.log + - grep 'Результат прогона тестов <Да>' /tmp/test.log + +after_success: + - bash <(curl -s https://codecov.io/bash) + - ./sonar-qube.sh + + jobs: include: - #- stage: Тестирование - # script: oscript /usr/share/oscript/lib/opm/src/opm.os test - stage: Сборка и публикация github & hub.oscript.io - script: skip + script: skip before_deploy: - - oscript /usr/share/oscript/lib/opm/src/opm.os build ./ + - docker run -it -v $(pwd):/work_dir harmit/ci-image sh -c 'cd /work_dir; opm build ./ ; exit' deploy: - provider: releases api_key: "$GITHUB_OAUTH_TOKEN" file_glob: true - file: v8storage*.ospx + file: $PACKAGE_NAME*.ospx skip_cleanup: true on: branch: master tags: true - provider: script skip_cleanup: true - script: oscript /usr/share/oscript/lib/opm/src/opm.os push --token $GITHUB_OAUTH_TOKEN --channel dev --file ./v8storage-*.ospx; + script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel dev --file ./$PACKAGE_NAME-*.ospx; exit' on: branch: develop - provider: script skip_cleanup: true - script: oscript /usr/share/oscript/lib/opm/src/opm.os push --token $GITHUB_OAUTH_TOKEN --channel stable --file ./v8storage-*.ospx; + script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel stable --file ./$PACKAGE_NAME-*.ospx; exit' on: branch: master tags: true diff --git a/LICENSE.md b/LICENSE similarity index 97% rename from LICENSE.md rename to LICENSE index e1ea7ba..c94bbbe 100644 --- a/LICENSE.md +++ b/LICENSE @@ -1,26 +1,26 @@ -The MIT License (MIT) -===================== - -Copyright © `2017` `Khorev Aleksey ` - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the “Software”), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - +The MIT License (MIT) +===================== + +Copyright © `2017` `Khorev Aleksey ` + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + diff --git "a/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON.xml" "b/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON.xml" index 3089be2..ba11ace 100644 --- "a/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON.xml" +++ "b/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON.xml" @@ -1,23 +1,23 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - b909bc5e-420b-11e7-3b8d-bcee7b73c08f - - - b909bc54-420b-11e7-3b8d-bcee7b73c08f - b909bc55-420b-11e7-3b8d-bcee7b73c08f - - - - ОбработкаКонвертацииMXLJSON - - - - - - - + + + + + + c3831ec8-d8d5-4f93-8a22-f9bfae07327f + b909bc5e-420b-11e7-3b8d-bcee7b73c08f + + + b909bc54-420b-11e7-3b8d-bcee7b73c08f + b909bc55-420b-11e7-3b8d-bcee7b73c08f + + + + ОбработкаКонвертацииMXLJSON + + + + + + + \ No newline at end of file diff --git "a/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/Ext/ObjectModule.bsl" "b/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/Ext/ObjectModule.bsl" index f69c288..bb8e1c0 100644 --- "a/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/Ext/ObjectModule.bsl" +++ "b/epf/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON/Ext/ObjectModule.bsl" @@ -1,276 +1,276 @@ -Процедура СконвертироватьВJSON() - - //ПараметрЗапуска1 = "/tmp/2xqb2nhv.8wr.mxl;/media/khorevaa/764B7AA318E25C28/os-projects/os/v8storage/tests/fixtures/report.json"; - - МассивПараметров = СтрРазделить(ПараметрЗапуска,";"); - - Если НЕ МассивПараметров.Количество() = 2 Тогда - ЗавершитьРаботуСистемы(Ложь,Ложь); - КонецЕсли; - - - ИмяВходногоФайла = МассивПараметров[0]; - ИмяИсходящегоФайла = МассивПараметров[1]; - - МассивИменВерсии = Новый Массив; - МассивИменВерсии.Добавить(НРег("Версия:")); - МассивИменВерсии.Добавить(НРег("Version:")); - ТабДок = Новый ТабличныйДокумент; - ТабДок.Прочитать(ИмяВходногоФайла); - Высота = ТабДок.ВысотаТаблицы; - Ширина = ТабДок.ШиринаТаблицы; // всегда 9 - - //Первая версия начинается с 5 строчки - КолонкаКлюча = 1; - КолонкаЗначенияКлюча = 2; - - МассивАвторов = Новый Массив; - МассивВерсий = Новый Массив; - - НачальнаяПозиция = 4; - - Для НачальнаяПозиция = НачальнаяПозиция + 1 По Высота Цикл - - ТекстОбластиВерсия = ТабДок.Область(НачальнаяПозиция,КолонкаКлюча,НачальнаяПозиция,КолонкаКлюча).Текст; - Если Не МассивИменВерсии.Найти(НРег(ТекстОбластиВерсия)) = Неопределено Тогда - - НачальнаяПозицияВерсии = НачальнаяПозиция; - - НомерВерсии = ТабДок.Область(НачальнаяПозицияВерсии,КолонкаЗначенияКлюча,НачальнаяПозицияВерсии,КолонкаЗначенияКлюча).Текст; - АвторВерсии = ПолучитьАвтора(ТабДок, НачальнаяПозицияВерсии); - ДатаВерсии = ПолучитьДатуВремяВерсии(ТабДок, НачальнаяПозицияВерсии); - КомментарийВерсии = ПолучитьКомментарийВерсии(ТабДок, НачальнаяПозицияВерсии); - - СтруктураВерсии = Новый Структура; - СтруктураВерсии.Вставить("Номер", НомерВерсии); - СтруктураВерсии.Вставить("Автор", АвторВерсии); - СтруктураВерсии.Вставить("Дата", ДатаВерсии); - СтруктураВерсии.Вставить("Комментарий", КомментарийВерсии); - - - - МассивВерсий.Добавить(СтруктураВерсии); - Если МассивАвторов.Найти(АвторВерсии) = Неопределено Тогда - МассивАвторов.Добавить(АвторВерсии); - КонецЕсли; - КонецЕсли; - - - КонецЦикла; - - - Структура = Новый Структура; - Структура.Вставить("Версии", МассивВерсий); - Структура.Вставить("Авторы", МассивАвторов); - - ЗаписьJSON = Новый ЗаписьJSON; - ЗаписьJSON.ОткрытьФайл(ИмяИсходящегоФайла); - ЗаписатьJSON(ЗаписьJSON, Структура); - - ЗаписьJSON.Закрыть(); - - //Сообщить(СтрШаблон("Количество версий: %1",МассивВерсий.Количество())); - ЗавершитьРаботуСистемы(Ложь,Ложь); - -КонецПроцедуры - -Функция ПолучитьАвтора(ТабДок, НачальнаяПозицияВерсии) - - Возврат ТабДок.Область(НачальнаяПозицияВерсии+1,2,НачальнаяПозицияВерсии+1,2).Текст; - -КонецФункции - -Функция ПолучитьДатуВремяВерсии(ТабДок, НачальнаяПозицияВерсии) - - Дата = ТабДок.Область(НачальнаяПозицияВерсии+2,2,НачальнаяПозицияВерсии+2,2).Текст; - Время = ТабДок.Область(НачальнаяПозицияВерсии+3,2,НачальнаяПозицияВерсии+3,2).Текст; - - Возврат СтрВДату(СтрШаблон("%1 %2", Дата, Время)); - -КонецФункции - - -Функция СтрВДату(Знач сДата) Экспорт - - Перем п_мТЕМП; // массив временных переменных - -//-----для локализации ------------------------------ - Перем п_мФорматы; - п_мФорматы = Новый Массив(4); - п_мФорматы[0] = "г"; // знак года - п_мФорматы[1] = "ЧЦ=2; ЧН=; ЧВН="; - п_мФорматы[2] = "ЧГ=0"; - п_мФорматы[3] = "ДФ=МММ"; -//--------------------------------------------------- - - Если ПустаяСтрока(сДата) Тогда - п_мТЕМП[6] =Дата("00010101000000"); - Возврат п_мТЕМП[6]; - КонецЕсли; - - сДата = Формат(сДата, п_мФорматы[2]); //на случай если в формате 1с числом: 20150320220315. (+локализация) - - //Если использовать конструкцию "Если Найти(сДата,..." , то перебор букв строки будет происходить 2а раза: Найти и СтрЗаменить //Использование Найти в данном случае бессмысленно - // можно добавить любой разделитель - @, #, %, и тд, неважно. Главное, заменить их на "." - сДата = СтрЗаменить(сДата, "«", ""); //«1 Фев 05 г.» - сДата = СтрЗаменить(сДата, "»", ""); //«1 Фев 05 г.» - сДата = СтрЗаменить(сДата, п_мФорматы[0] + ".", ""); //1 Фев 05 г. 17:20:00 //просто "г" нельзя из-за "авГуст", например. Но в далее,после парсинга месяца, любое "г" в строке, удаляется - сДата = СтрЗаменить(сДата, "/", "."); // 1/2/5 - сДата = СтрЗаменить(сДата, "\", "."); // 1\02\05 - сДата = СтрЗаменить(сДата, "-", "."); // 1-02-05 - сДата = СтрЗаменить(сДата, Символы.Таб, "."); // 01.02.2005 17:20:00 - сДата = СтрЗаменить(сДата, " ", "."); // 1/02 2005 17:20:00 - сДата = СтрЗаменить(сДата, "..", "."); //Возможны, появление двойных точек из за "янв." в "янв" или из-за " г. ". - сДата = НРег(СокрЛП(сДата)); // строку в нижний регистр, чтоб проще было с Янв Январь янв и тд - - п_мТЕМП = Новый массив(7);//массив для временных переменных - - п_мТЕМП[0] = Найти(сДата,"."); - - Если п_мТЕМП[0] = 0 Тогда - //если точек нет - - Если Найти(сДата,":") Тогда - //только время (или ошибка) - сДата = "01.01.0001." + сДата; - п_мТЕМП[0] = Найти(сДата,"."); - иначе - //похоже на формат 1с. Можно добавить "попытку"... - п_мТЕМП[6] = дата(сДата); - Возврат п_мТЕМП[6]; - - КонецЕсли; - - - //иначеЕсли п_мТЕМП[0] = 1 Тогда - // //например, месяц и год - КонецЕсли; - - - // ----- ДНИ ------------------------------------- - п_мТЕМП[0] = Лев(сДата, п_мТЕМП[0] - 1);//дни - п_мТЕМП[4] = Прав(сДата, СтрДлина(сДата) - СтрДлина(п_мТЕМП[0])-1);// месяц и все что справа - п_мТЕМП[0] = Формат(Число(п_мТЕМП[0]),п_мФорматы[1]);//дни в формат двух чисел - // ----- Месяц ----------------------------------- - п_мТЕМП[1] = Лев(п_мТЕМП[4], найти(п_мТЕМП[4],".") - 1);// месяц - п_мТЕМП[4] = Прав(п_мТЕМП[4], СтрДлина(п_мТЕМП[4]) - СтрДлина(п_мТЕМП[1])-1);// год и все что справа - //Возможны варианты месяца "янв" "янв." "январь" "января" - Если СтрДлина(п_мТЕМП[1]) > 2 Тогда // месяц в виде янв или январь - - п_мТЕМП[2] = 0; - Пока п_мТЕМП[2] < 12 Цикл - - п_мТЕМП[2] = п_мТЕМП[2]+1; - // берем из "янв." только "янв" - п_мТЕМП[3] = СтрЗаменить(Формат(Дата("2001" + Формат(п_мТЕМП[2],п_мФорматы[1]) + "01"), п_мФорматы[3]),".","");// + локализация - - п_мТЕМП[3] = найти(п_мТЕМП[1], п_мТЕМП[3]); - - Если п_мТЕМП[3] > 0 тогда - п_мТЕМП[1] = Формат(п_мТЕМП[2],п_мФорматы[1]); - прервать; - КонецЕсли; - КонецЦикла; - Иначе - п_мТЕМП[1] = Формат(Число(п_мТЕМП[1]),п_мФорматы[1]); - КонецЕсли; - // ----- ГОД ----------------------------------- - //Если в строке было "г" без точки("г.") - п_мТЕМП[4] = СтрЗаменить(п_мТЕМП[4], п_мФорматы[0], ""); - //ищем год. Дата может быть без времени, т.е. год последний в строке - п_мТЕМП[2] = Найти(п_мТЕМП[4],"."); - - Если п_мТЕМП[2]>0 Тогда - п_мТЕМП[2] = Лев(п_мТЕМП[4], п_мТЕМП[2] - 1);// год - п_мТЕМП[4] = Прав(п_мТЕМП[4], СтрДлина(п_мТЕМП[4]) - СтрДлина(п_мТЕМП[2])-1);//время и все что справа - Иначе - п_мТЕМП[2] = п_мТЕМП[4]; - п_мТЕМП[4] = ""; - КонецЕсли; - - //проверяем год - п_мТЕМП[3] = СтрДлина(п_мТЕМП[2]); - //если год из двух цыфр - Если п_мТЕМП[3] = 2 или п_мТЕМП[3] = 1 Тогда - п_мТЕМП[3] = Число(п_мТЕМП[2]);// год как число - - //что означает 15 в "20.03.15"? это 2015г или 1915г? (Настраиваем под себя или выдаём ошибку) - // в моем варианте если < 50 то это 2000г. иначе 1900г. - Если п_мТЕМП[3] < 50 Тогда - п_мТЕМП[2] = "20" + Формат(п_мТЕМП[3],п_мФорматы[1]); - Иначе - п_мТЕМП[2] = "19" + Формат(п_мТЕМП[3],п_мФорматы[1]); - КонецЕсли; - - КонецЕсли; - - // ======================= Форматируем время ============================== - п_мТЕМП[6] = СтрЗаменить(п_мТЕМП[4],":", ".");// если дата была, например: 17-30-10, то сейчас 17.30.10 - //"попытка" на преобразование даты, по времени, занимает столько же, а по ресурсам больше, чем сам парсинг времени. - //поэтому, убиваем двух зайцев перебором часы/мин/сек сразу - Если СтрДлина(п_мТЕМП[6]) > 0 Тогда - - п_мТЕМП[5] = найти(п_мТЕМП[6],"."); - Если п_мТЕМП[5] > 0 Тогда - // ========= часы ================= - п_мТЕМП[3] = Лев(п_мТЕМП[6], найти(п_мТЕМП[6],".") - 1);//часы - п_мТЕМП[6] = Прав(п_мТЕМП[6], СтрДлина(п_мТЕМП[6]) - СтрДлина(п_мТЕМП[3])-1);// минуты и все что справа - - Если п_мТЕМП[3] = "" тогда - п_мТЕМП[3] = "00"; - Иначе - //при переводе в дату лидирующий 0 у часов удаляется. Т.е. след. строка бесполезна - //п_мТЕМП[3] = Формат(Число(п_мТЕМП[3]),п_мФорматы[1]);//часы в формат двух чисел - КонецЕсли; - - п_мТЕМП[5] = найти(п_мТЕМП[6],"."); - Если п_мТЕМП[5] > 0 Тогда - // ========= минуты ================= - п_мТЕМП[4] = Лев(п_мТЕМП[6], найти(п_мТЕМП[6],".") - 1); - п_мТЕМП[6] = Прав(п_мТЕМП[6], СтрДлина(п_мТЕМП[6]) - СтрДлина(п_мТЕМП[4])-1);// секунды и все что справа - Если п_мТЕМП[4] = "" тогда - п_мТЕМП[4] = "00"; - Иначе - п_мТЕМП[4] = Формат(Число(п_мТЕМП[4]),п_мФорматы[1]);//минуты в формат двух чисел - КонецЕсли; - - // ========= секунды ================= - Если СтрДлина(п_мТЕМП[6]) = 0 Тогда - п_мТЕМП[5] = "00"; - Иначе - п_мТЕМП[5] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]);//секунды в формат двух чисел - КонецЕсли; - - Иначе - п_мТЕМП[4] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]); - п_мТЕМП[5] = "00"; - КонецЕсли; - Иначе - п_мТЕМП[3] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]); - п_мТЕМП[4] = "00"; - п_мТЕМП[5] = "00"; - КонецЕсли; - - Иначе - п_мТЕМП[3] = "00"; - п_мТЕМП[4] = "00"; - п_мТЕМП[5] = "00"; - КонецЕсли; - - п_мТЕМП[6] = п_мТЕМП[0] + "." + п_мТЕМП[1] + "." + п_мТЕМП[2] + " " + п_мТЕМП[3] + ":" + п_мТЕМП[4] + ":" + п_мТЕМП[5]; - п_мТЕМП[6] = дата(п_мТЕМП[6]); - - Возврат п_мТЕМП[6]; - - -КонецФункции - - -Функция ПолучитьКомментарийВерсии(ТабДок, НачальнаяПозицияВерсии) - - Возврат ТабДок.Область(НачальнаяПозицияВерсии+4,2,НачальнаяПозицияВерсии+4,2).Текст; - -КонецФункции - - +Процедура СконвертироватьВJSON() + + //ПараметрЗапуска1 = "/tmp/2xqb2nhv.8wr.mxl;/media/khorevaa/764B7AA318E25C28/os-projects/os/v8storage/tests/fixtures/report.json"; + + МассивПараметров = СтрРазделить(ПараметрЗапуска,";"); + + Если НЕ МассивПараметров.Количество() = 2 Тогда + ЗавершитьРаботуСистемы(Ложь,Ложь); + КонецЕсли; + + + ИмяВходногоФайла = МассивПараметров[0]; + ИмяИсходящегоФайла = МассивПараметров[1]; + + МассивИменВерсии = Новый Массив; + МассивИменВерсии.Добавить(НРег("Версия:")); + МассивИменВерсии.Добавить(НРег("Version:")); + ТабДок = Новый ТабличныйДокумент; + ТабДок.Прочитать(ИмяВходногоФайла); + Высота = ТабДок.ВысотаТаблицы; + Ширина = ТабДок.ШиринаТаблицы; // всегда 9 + + //Первая версия начинается с 5 строчки + КолонкаКлюча = 1; + КолонкаЗначенияКлюча = 2; + + МассивАвторов = Новый Массив; + МассивВерсий = Новый Массив; + + НачальнаяПозиция = 4; + + Для НачальнаяПозиция = НачальнаяПозиция + 1 По Высота Цикл + + ТекстОбластиВерсия = ТабДок.Область(НачальнаяПозиция,КолонкаКлюча,НачальнаяПозиция,КолонкаКлюча).Текст; + Если Не МассивИменВерсии.Найти(НРег(ТекстОбластиВерсия)) = Неопределено Тогда + + НачальнаяПозицияВерсии = НачальнаяПозиция; + + НомерВерсии = ТабДок.Область(НачальнаяПозицияВерсии,КолонкаЗначенияКлюча,НачальнаяПозицияВерсии,КолонкаЗначенияКлюча).Текст; + АвторВерсии = ПолучитьАвтора(ТабДок, НачальнаяПозицияВерсии); + ДатаВерсии = ПолучитьДатуВремяВерсии(ТабДок, НачальнаяПозицияВерсии); + КомментарийВерсии = ПолучитьКомментарийВерсии(ТабДок, НачальнаяПозицияВерсии); + + СтруктураВерсии = Новый Структура; + СтруктураВерсии.Вставить("Номер", НомерВерсии); + СтруктураВерсии.Вставить("Автор", АвторВерсии); + СтруктураВерсии.Вставить("Дата", ДатаВерсии); + СтруктураВерсии.Вставить("Комментарий", КомментарийВерсии); + + + + МассивВерсий.Добавить(СтруктураВерсии); + Если МассивАвторов.Найти(АвторВерсии) = Неопределено Тогда + МассивАвторов.Добавить(АвторВерсии); + КонецЕсли; + КонецЕсли; + + + КонецЦикла; + + + Структура = Новый Структура; + Структура.Вставить("Версии", МассивВерсий); + Структура.Вставить("Авторы", МассивАвторов); + + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.ОткрытьФайл(ИмяИсходящегоФайла); + ЗаписатьJSON(ЗаписьJSON, Структура); + + ЗаписьJSON.Закрыть(); + + //Сообщить(СтрШаблон("Количество версий: %1",МассивВерсий.Количество())); + ЗавершитьРаботуСистемы(Ложь,Ложь); + +КонецПроцедуры + +Функция ПолучитьАвтора(ТабДок, НачальнаяПозицияВерсии) + + Возврат ТабДок.Область(НачальнаяПозицияВерсии+1,2,НачальнаяПозицияВерсии+1,2).Текст; + +КонецФункции + +Функция ПолучитьДатуВремяВерсии(ТабДок, НачальнаяПозицияВерсии) + + Дата = ТабДок.Область(НачальнаяПозицияВерсии+2,2,НачальнаяПозицияВерсии+2,2).Текст; + Время = ТабДок.Область(НачальнаяПозицияВерсии+3,2,НачальнаяПозицияВерсии+3,2).Текст; + + Возврат СтрВДату(СтрШаблон("%1 %2", Дата, Время)); + +КонецФункции + + +Функция СтрВДату(Знач сДата) Экспорт + + Перем п_мТЕМП; // массив временных переменных + +//-----для локализации ------------------------------ + Перем п_мФорматы; + п_мФорматы = Новый Массив(4); + п_мФорматы[0] = "г"; // знак года + п_мФорматы[1] = "ЧЦ=2; ЧН=; ЧВН="; + п_мФорматы[2] = "ЧГ=0"; + п_мФорматы[3] = "ДФ=МММ"; +//--------------------------------------------------- + + Если ПустаяСтрока(сДата) Тогда + п_мТЕМП[6] =Дата("00010101000000"); + Возврат п_мТЕМП[6]; + КонецЕсли; + + сДата = Формат(сДата, п_мФорматы[2]); //на случай если в формате 1с числом: 20150320220315. (+локализация) + + //Если использовать конструкцию "Если Найти(сДата,..." , то перебор букв строки будет происходить 2а раза: Найти и СтрЗаменить //Использование Найти в данном случае бессмысленно + // можно добавить любой разделитель - @, #, %, и тд, неважно. Главное, заменить их на "." + сДата = СтрЗаменить(сДата, "«", ""); //«1 Фев 05 г.» + сДата = СтрЗаменить(сДата, "»", ""); //«1 Фев 05 г.» + сДата = СтрЗаменить(сДата, п_мФорматы[0] + ".", ""); //1 Фев 05 г. 17:20:00 //просто "г" нельзя из-за "авГуст", например. Но в далее,после парсинга месяца, любое "г" в строке, удаляется + сДата = СтрЗаменить(сДата, "/", "."); // 1/2/5 + сДата = СтрЗаменить(сДата, "\", "."); // 1\02\05 + сДата = СтрЗаменить(сДата, "-", "."); // 1-02-05 + сДата = СтрЗаменить(сДата, Символы.Таб, "."); // 01.02.2005 17:20:00 + сДата = СтрЗаменить(сДата, " ", "."); // 1/02 2005 17:20:00 + сДата = СтрЗаменить(сДата, "..", "."); //Возможны, появление двойных точек из за "янв." в "янв" или из-за " г. ". + сДата = НРег(СокрЛП(сДата)); // строку в нижний регистр, чтоб проще было с Янв Январь янв и тд + + п_мТЕМП = Новый массив(7);//массив для временных переменных + + п_мТЕМП[0] = Найти(сДата,"."); + + Если п_мТЕМП[0] = 0 Тогда + //если точек нет + + Если Найти(сДата,":") Тогда + //только время (или ошибка) + сДата = "01.01.0001." + сДата; + п_мТЕМП[0] = Найти(сДата,"."); + иначе + //похоже на формат 1с. Можно добавить "попытку"... + п_мТЕМП[6] = дата(сДата); + Возврат п_мТЕМП[6]; + + КонецЕсли; + + + //иначеЕсли п_мТЕМП[0] = 1 Тогда + // //например, месяц и год + КонецЕсли; + + + // ----- ДНИ ------------------------------------- + п_мТЕМП[0] = Лев(сДата, п_мТЕМП[0] - 1);//дни + п_мТЕМП[4] = Прав(сДата, СтрДлина(сДата) - СтрДлина(п_мТЕМП[0])-1);// месяц и все что справа + п_мТЕМП[0] = Формат(Число(п_мТЕМП[0]),п_мФорматы[1]);//дни в формат двух чисел + // ----- Месяц ----------------------------------- + п_мТЕМП[1] = Лев(п_мТЕМП[4], найти(п_мТЕМП[4],".") - 1);// месяц + п_мТЕМП[4] = Прав(п_мТЕМП[4], СтрДлина(п_мТЕМП[4]) - СтрДлина(п_мТЕМП[1])-1);// год и все что справа + //Возможны варианты месяца "янв" "янв." "январь" "января" + Если СтрДлина(п_мТЕМП[1]) > 2 Тогда // месяц в виде янв или январь + + п_мТЕМП[2] = 0; + Пока п_мТЕМП[2] < 12 Цикл + + п_мТЕМП[2] = п_мТЕМП[2]+1; + // берем из "янв." только "янв" + п_мТЕМП[3] = СтрЗаменить(Формат(Дата("2001" + Формат(п_мТЕМП[2],п_мФорматы[1]) + "01"), п_мФорматы[3]),".","");// + локализация + + п_мТЕМП[3] = найти(п_мТЕМП[1], п_мТЕМП[3]); + + Если п_мТЕМП[3] > 0 тогда + п_мТЕМП[1] = Формат(п_мТЕМП[2],п_мФорматы[1]); + прервать; + КонецЕсли; + КонецЦикла; + Иначе + п_мТЕМП[1] = Формат(Число(п_мТЕМП[1]),п_мФорматы[1]); + КонецЕсли; + // ----- ГОД ----------------------------------- + //Если в строке было "г" без точки("г.") + п_мТЕМП[4] = СтрЗаменить(п_мТЕМП[4], п_мФорматы[0], ""); + //ищем год. Дата может быть без времени, т.е. год последний в строке + п_мТЕМП[2] = Найти(п_мТЕМП[4],"."); + + Если п_мТЕМП[2]>0 Тогда + п_мТЕМП[2] = Лев(п_мТЕМП[4], п_мТЕМП[2] - 1);// год + п_мТЕМП[4] = Прав(п_мТЕМП[4], СтрДлина(п_мТЕМП[4]) - СтрДлина(п_мТЕМП[2])-1);//время и все что справа + Иначе + п_мТЕМП[2] = п_мТЕМП[4]; + п_мТЕМП[4] = ""; + КонецЕсли; + + //проверяем год + п_мТЕМП[3] = СтрДлина(п_мТЕМП[2]); + //если год из двух цыфр + Если п_мТЕМП[3] = 2 или п_мТЕМП[3] = 1 Тогда + п_мТЕМП[3] = Число(п_мТЕМП[2]);// год как число + + //что означает 15 в "20.03.15"? это 2015г или 1915г? (Настраиваем под себя или выдаём ошибку) + // в моем варианте если < 50 то это 2000г. иначе 1900г. + Если п_мТЕМП[3] < 50 Тогда + п_мТЕМП[2] = "20" + Формат(п_мТЕМП[3],п_мФорматы[1]); + Иначе + п_мТЕМП[2] = "19" + Формат(п_мТЕМП[3],п_мФорматы[1]); + КонецЕсли; + + КонецЕсли; + + // ======================= Форматируем время ============================== + п_мТЕМП[6] = СтрЗаменить(п_мТЕМП[4],":", ".");// если дата была, например: 17-30-10, то сейчас 17.30.10 + //"попытка" на преобразование даты, по времени, занимает столько же, а по ресурсам больше, чем сам парсинг времени. + //поэтому, убиваем двух зайцев перебором часы/мин/сек сразу + Если СтрДлина(п_мТЕМП[6]) > 0 Тогда + + п_мТЕМП[5] = найти(п_мТЕМП[6],"."); + Если п_мТЕМП[5] > 0 Тогда + // ========= часы ================= + п_мТЕМП[3] = Лев(п_мТЕМП[6], найти(п_мТЕМП[6],".") - 1);//часы + п_мТЕМП[6] = Прав(п_мТЕМП[6], СтрДлина(п_мТЕМП[6]) - СтрДлина(п_мТЕМП[3])-1);// минуты и все что справа + + Если п_мТЕМП[3] = "" тогда + п_мТЕМП[3] = "00"; + Иначе + //при переводе в дату лидирующий 0 у часов удаляется. Т.е. след. строка бесполезна + //п_мТЕМП[3] = Формат(Число(п_мТЕМП[3]),п_мФорматы[1]);//часы в формат двух чисел + КонецЕсли; + + п_мТЕМП[5] = найти(п_мТЕМП[6],"."); + Если п_мТЕМП[5] > 0 Тогда + // ========= минуты ================= + п_мТЕМП[4] = Лев(п_мТЕМП[6], найти(п_мТЕМП[6],".") - 1); + п_мТЕМП[6] = Прав(п_мТЕМП[6], СтрДлина(п_мТЕМП[6]) - СтрДлина(п_мТЕМП[4])-1);// секунды и все что справа + Если п_мТЕМП[4] = "" тогда + п_мТЕМП[4] = "00"; + Иначе + п_мТЕМП[4] = Формат(Число(п_мТЕМП[4]),п_мФорматы[1]);//минуты в формат двух чисел + КонецЕсли; + + // ========= секунды ================= + Если СтрДлина(п_мТЕМП[6]) = 0 Тогда + п_мТЕМП[5] = "00"; + Иначе + п_мТЕМП[5] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]);//секунды в формат двух чисел + КонецЕсли; + + Иначе + п_мТЕМП[4] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]); + п_мТЕМП[5] = "00"; + КонецЕсли; + Иначе + п_мТЕМП[3] = Формат(Число(п_мТЕМП[6]),п_мФорматы[1]); + п_мТЕМП[4] = "00"; + п_мТЕМП[5] = "00"; + КонецЕсли; + + Иначе + п_мТЕМП[3] = "00"; + п_мТЕМП[4] = "00"; + п_мТЕМП[5] = "00"; + КонецЕсли; + + п_мТЕМП[6] = п_мТЕМП[0] + "." + п_мТЕМП[1] + "." + п_мТЕМП[2] + " " + п_мТЕМП[3] + ":" + п_мТЕМП[4] + ":" + п_мТЕМП[5]; + п_мТЕМП[6] = дата(п_мТЕМП[6]); + + Возврат п_мТЕМП[6]; + + +КонецФункции + + +Функция ПолучитьКомментарийВерсии(ТабДок, НачальнаяПозицияВерсии) + + Возврат ТабДок.Область(НачальнаяПозицияВерсии+4,2,НачальнаяПозицияВерсии+4,2).Текст; + +КонецФункции + + СконвертироватьВJSON(); \ No newline at end of file diff --git a/features/step_definitions/shared.os b/features/step_definitions/shared.os new file mode 100644 index 0000000..48727bc --- /dev/null +++ b/features/step_definitions/shared.os @@ -0,0 +1,57 @@ +#Использовать "../.." +#Использовать asserts +#Использовать tempfiles +#Использовать fs + +// Реализация шагов BDD-фич/сценариев c помощью фреймворка /~https://github.com/artbear/1bdd + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯКопируюТестовоеХранилищеВКаталогИзПеременной"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + //ВременныеФайлы.Удалить(); +КонецПроцедуры + +//Я копирую тестовое хранилище в каталог из переменной "КаталогХранилищаКонфигурации" +Процедура ЯКопируюТестовоеХранилищеВКаталогИзПеременной(Знач ИмяПеременной) Экспорт + + ВременныйКаталогХранилища = БДД.ПолучитьИзКонтекста(ИмяПеременной); + ФС.КопироватьСодержимоеКаталога(КаталогТестовогоХранилища(), ВременныйКаталогХранилища); + +КонецПроцедуры + +Функция КаталогТестовогоХранилища() + + Возврат ОбъединитьПути(КаталогFixture(), "storage"); + +КонецФункции + +Функция КаталогFixture() + + Возврат ОбъединитьПути(КаталогПроекта(), "tests", "fixtures"); + +КонецФункции + +Функция КаталогПроекта() + + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); + +КонецФункции \ No newline at end of file diff --git "a/features/step_definitions/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.os" "b/features/step_definitions/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.os" index 5f795fe..d46e43b 100644 --- "a/features/step_definitions/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.os" +++ "b/features/step_definitions/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.os" @@ -14,10 +14,13 @@ ВсеШаги = Новый Массив; ВсеШаги.Добавить("ЯЗагружаюФайлКонфигурацииВБазуДанных"); - ВсеШаги.Добавить("ЯСоздаюФайловоеХранилищеСПараметромПодключенияБазыКхранилищу"); + ВсеШаги.Добавить("ЯСоздаюФайловоеХранилищеСПараметромПодключенияБазыКХранилищу"); ВсеШаги.Добавить("ВыводЛогаСодержит"); ВсеШаги.Добавить("ЯВыполняюОтключениеОтХранилищаКонфигурации"); - ВсеШаги.Добавить("ЯПодключаюБазуКхранилищуСПараметромЗаменыКонфигурации"); + ВсеШаги.Добавить("ЯПодключаюБазуКХранилищуСПараметромЗаменыКонфигурации"); + ВсеШаги.Добавить("ЯВыполняюСборкуОбработкиКонвертацииОтчетаИзXmlВJsonИСохраняюВПеременной"); + ВсеШаги.Добавить("ФайлИзПеременнойСуществует"); + ВсеШаги.Добавить("ЯОбновлениеКонфигурацииИзХранилищаНаВерсию"); Возврат ВсеШаги; КонецФункции @@ -31,7 +34,7 @@ // Процедура выполняется после завершения каждого сценария Процедура ПослеЗапускаСценария(Знач Узел) Экспорт - ВременныеФайлы.Удалить(); + //ВременныеФайлы.Удалить(); КонецПроцедуры //Я загружаю файл конфигурации "../tests/fixtures/1Cv8.cf" в базу данных @@ -75,3 +78,40 @@ КонецПроцедуры +//Я выполняю сборку обработки конвертации отчета из xml в json и сохраняю в переменной "ОбработкаXMLJSON" +Процедура ЯВыполняюСборкуОбработкиКонвертацииОтчетаИзXmlВJsonИСохраняюВПеременной(Знач ИмяПеременной) Экспорт + + ИмяВременногоФайла = ВременныеФайлы.НовоеИмяФайла("epf"); + ХранилищеКонфигурации = БДД.ПолучитьИзКонтекста("ХранилищеКонфигурации"); + ХранилищеКонфигурации.СобратьОбработкуКонвертации(КаталогОбработки(), ИмяВременногоФайла); + + БДД.СохранитьВКонтекст(ИмяПеременной, ИмяВременногоФайла); + +КонецПроцедуры + +//Файл из переменной "ОбарботкаXMLJSON" существует +Процедура ФайлИзПеременнойСуществует(Знач ИмяПеременной) Экспорт + ВременныйФайл = БДД.ПолучитьИзКонтекста(ИмяПеременной); + Ожидаем.Что(Новый Файл(ВременныйФайл), "Файл не существует").Существует(); +КонецПроцедуры + +//Я обновление конфигурации из хранилища на версию "2" +Процедура ЯОбновлениеКонфигурацииИзХранилищаНаВерсию(Знач НомерВерсии) Экспорт + + ХранилищеКонфигурации = БДД.ПолучитьИзКонтекста("ХранилищеКонфигурации"); + ХранилищеКонфигурации.ОбновитьКонфигурациюНаВерсию(НомерВерсии); + +КонецПроцедуры + + +Функция КаталогОбработки() + + Возврат ОбъединитьПути(КаталогПроекта(), "epf", "ОбработкаКонвертацииMXLJSON", "ОбработкаКонвертацииMXLJSON.xml"); + +КонецФункции + +Функция КаталогПроекта() + + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); + +КонецФункции diff --git "a/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" "b/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" index d7b2306..7361942 100644 --- "a/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" +++ "b/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" @@ -9,16 +9,16 @@ // Метод выдает список шагов, реализованных в данном файле-шагов Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт - БДД = КонтекстФреймворкаBDD; + БДД = КонтекстФреймворкаBDD; - ВсеШаги = Новый Массив; + ВсеШаги = Новый Массив; - ВсеШаги.Добавить("ЯДобавляюПользователяСПаролемИПравом"); - ВсеШаги.Добавить("ЯВыполняюОшибочнуюПопыткуЗахватОбъектовВХранилищеКонфигурацииПоФайлуСпискаОбъектов"); - ВсеШаги.Добавить("ЯКопируюПользователейИзХранилищаСПользователейИПаролем"); - ВсеШаги.Добавить("ЯВыполняюПопыткуПодключенияБазыКхранилищуСПараметромЗаменыКонфигурации"); + ВсеШаги.Добавить("ЯДобавляюПользователяСПаролемИПравом"); + ВсеШаги.Добавить("ЯВыполняюОшибочнуюПопыткуЗахватОбъектовВХранилищеКонфигурацииПоФайлуСпискаОбъектов"); + ВсеШаги.Добавить("ЯКопируюПользователейИзХранилищаСПользователейИПаролем"); + ВсеШаги.Добавить("ЯВыполняюПопыткуПодключенияБазыКХранилищуСПараметромЗаменыКонфигурации"); - Возврат ВсеШаги; + Возврат ВсеШаги; КонецФункции // Реализация шагов @@ -30,7 +30,7 @@ // Процедура выполняется после завершения каждого сценария Процедура ПослеЗапускаСценария(Знач Узел) Экспорт - ВременныеФайлы.Удалить(); + //ВременныеФайлы.Удалить(); КонецПроцедуры //Я добавляю пользователя "Тест_1" с паролем "Пароль1" и правом "ТолькоЧтение" @@ -71,6 +71,3 @@ КонецПопытки; КонецПроцедуры - - - diff --git "a/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\241\320\277\320\270\321\201\320\272\320\260\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" "b/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\241\320\277\320\270\321\201\320\272\320\260\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" index f47145a..5f0ddbc 100644 --- "a/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\241\320\277\320\270\321\201\320\272\320\260\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" +++ "b/features/step_definitions/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\241\320\277\320\270\321\201\320\272\320\260\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" @@ -37,7 +37,7 @@ // Процедура выполняется после завершения каждого сценария Процедура ПослеЗапускаСценария(Знач Узел) Экспорт - ВременныеФайлы.Удалить(); + //ВременныеФайлы.Удалить(); КонецПроцедуры //Я создаю новый объект СписокОбъектовКонфигурации @@ -127,7 +127,6 @@ КонецПроцедуры - //Я устанавливаю каталог хранилища из переменной "КаталогХранилищаКонфигурации" Процедура ЯУстанавливаюКаталогХранилищаИзПеременной(Знач КаталогХранилищаКонфигурации) Экспорт diff --git "a/features/step_definitions/\320\247\321\202\320\265\320\275\320\270\320\265\320\224\320\260\320\275\320\275\321\213\321\205\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" "b/features/step_definitions/\320\247\321\202\320\265\320\275\320\270\320\265\320\224\320\260\320\275\320\275\321\213\321\205\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" index dc12487..0141649 100644 --- "a/features/step_definitions/\320\247\321\202\320\265\320\275\320\270\320\265\320\224\320\260\320\275\320\275\321\213\321\205\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" +++ "b/features/step_definitions/\320\247\321\202\320\265\320\275\320\270\320\265\320\224\320\260\320\275\320\275\321\213\321\205\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" @@ -35,7 +35,7 @@ // Процедура выполняется после завершения каждого сценария Процедура ПослеЗапускаСценария(Знач Узел) Экспорт - ВременныеФайлы.Удалить(); + //ВременныеФайлы.Удалить(); КонецПроцедуры @@ -55,10 +55,10 @@ КонецПроцедуры //Я сохраняю значение временного каталога в переменной "КаталогХранилищаКонфигурации" -Процедура ЯСохраняюЗначениеВременногоКаталогаВПеременной(Знач КаталогХранилищаКонфигурации) Экспорт +Процедура ЯСохраняюЗначениеВременногоКаталогаВПеременной(Знач ИмяПеременной) Экспорт ВременныйКаталог = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); - БДД.СохранитьВКонтекст(КаталогХранилищаКонфигурации, ВременныйКаталог); + БДД.СохранитьВКонтекст(ИмяПеременной, ВременныйКаталог); КонецПроцедуры diff --git "a/features/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.feature" "b/features/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.feature" index f40fdd4..4b38919 100644 --- "a/features/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.feature" +++ "b/features/\320\236\320\261\321\211\320\270\320\265\320\244\321\203\320\275\320\272\321\206\320\270\320\270.feature" @@ -22,7 +22,7 @@ Тогда Вывод лога содержит "Создание хранилища конфигурации успешно завершено" И Я выполняю отключение от хранилища конфигурации -Сценарий: Подключение базы к хранилишю конфигурации +Сценарий: Подключение базы к хранилищу конфигурации Допустим Я создаю временный каталог и сохраняю его в контекст И Я копирую тестовое хранилище во временный каталог И Я сохраняю значение временного каталога в переменной "КаталогХранилищаКонфигурации" @@ -31,7 +31,7 @@ И Я подключаю базу к хранилищу с параметром замены конфигурации "Истина" Тогда Вывод лога содержит "Подключение информационной базы к хранилищу успешно завершено" -Сценарий: Подключение базы к хранилишю конфигурации без замены конфигурации +Сценарий: Подключение базы к хранилищу конфигурации без замены конфигурации Допустим Я создаю временный каталог и сохраняю его в контекст И Я копирую тестовое хранилище во временный каталог И Я сохраняю значение временного каталога в переменной "КаталогХранилищаКонфигурации" @@ -40,3 +40,14 @@ И Я подключаю базу к хранилищу с параметром замены конфигурации "Ложь" Тогда Вывод лога содержит "Подключение информационной базы к хранилищу успешно завершено" +Сценарий: Сборка обработки конвертации xml в json + Допустим Я выполняю сборку обработки конвертации отчета из xml в json и сохраняю в переменной "ОбработкаXMLJSON" + Тогда Файл из переменной "ОбарботкаXMLJSON" существует + +Сценарий: Обновление конфигурации на версию + Допустим Я создаю временный каталог и сохраняю его в контекст + И Я сохраняю значение временного каталога в переменной "КаталогХранилищаКонфигурации" + И Я копирую тестовое хранилище в каталог из переменной "КаталогХранилищаКонфигурации" + И Я устанавливаю каталог хранилища из переменной "КаталогХранилищаКонфигурации" + Когда Я обновление конфигурации из хранилища на версию "2" + Тогда Вывод лога содержит "Обновление конфигурации из хранилища успешно завершено" diff --git "a/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.feature" "b/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.feature" index d5e2b90..be8da20 100644 --- "a/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.feature" +++ "b/features/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.feature" @@ -2,19 +2,19 @@ Функционал: Работа с пользователями хранилища конфигурации Как разработчик - Я хочу иметь возможность добавлять пользователей в хранилища конфигруации без использования сторонних библиотек + Я хочу иметь возможность добавлять пользователей в хранилища конфигурации без использования сторонних библиотек Чтобы мочь автоматизировать больше рутинных действий на OneScript Контекст: Допустим Я создаю новый объект МенеджерХранилищаКонфигурации И Я создаю новый объект СписокОбъектовКонфигурации И Я создаю временный каталог и сохраняю его в контекст - И Я копирую тестовое хранилище во временный каталог И Я сохраняю значение временного каталога в переменной "КаталогХранилищаКонфигурации" + И Я копирую тестовое хранилище в каталог из переменной "КаталогХранилищаКонфигурации" И Я создаю временный каталог и сохраняю его в контекст И Я сохраняю значение временного каталога в переменной "ВременнаяБаза" И Я создаю временную базу в каталоге из переменной "ВременнаяБаза" - И я устанавливаю контекст выполнения конфигуратора + И Я устанавливаю контекст выполнения конфигуратора И Я устанавливаю каталог хранилища из переменной "КаталогХранилищаКонфигурации" И Я устанавливаю параметры авторизации пользователя "Администратор" и пароль "" @@ -34,6 +34,7 @@ Когда Я устанавливаю параметры авторизации пользователя "Тест_1" и пароль "Пароль1" И Я подключаю базу к хранилищу с параметром замены конфигурации "Истина" Тогда Вывод лога содержит "Подключение информационной базы к хранилищу успешно завершено" + И Я создаю новый объект СписокОбъектовКонфигурации И Я добавляю в список объектов захват корня конфигурации с включением подчиненных "Истина" И Я записываю список объектов конфигурации во временный файл и сохраняю значение в переменной "ФайлСпискаОбъектов" И Я выполняю захват объектов в хранилище конфигурации по файлу списка объектов diff --git a/lib.config b/lib.config deleted file mode 100644 index 41ab12d..0000000 --- a/lib.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/packagedef b/packagedef index f9923fd..3e945a8 100644 --- a/packagedef +++ b/packagedef @@ -17,16 +17,30 @@ // Процедура ПередСборкой(Знач РабочийКаталог) Экспорт - ПутьКИсходникамОбработки = ОбъединитьПути(РабочийКаталог, "epf", "ОбработкаКонвертацииMXLJSON", "ОбработкаКонвертацииMXLJSON.xml"); - ПутьККаталогуBin = ОбъединитьПути(РабочийКаталог, "bin"); + Сообщить("Собираю обработку конвертации из исходников"); + + // ПутьКИсходникамОбработки = ОбъединитьПути(РабочийКаталог, "epf", "ОбработкаКонвертацииMXLJSON", "ОбработкаКонвертацииMXLJSON.xml"); + // ПутьККаталогуBin = ОбъединитьПути(РабочийКаталог, "bin"); - ОбеспечитьКаталог(ПутьККаталогуBin); + // ОбеспечитьКаталог(ПутьККаталогуBin); - ПутьКФайлуОбработки = ОбъединитьПути(ПутьККаталогуBin, "ОбработкаКонвертацииMXLJSON.epf"); + // ПутьКФайлуОбработки = ОбъединитьПути(ПутьККаталогуBin, "ОбработкаКонвертацииMXLJSON.epf"); - ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации(); + // ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации(); - ХранилищеКонфигурации.СобратьОбработкуКонвертации(ПутьКИсходникамОбработки, ПутьКФайлуОбработки); + // ХранилищеКонфигурации.СобратьОбработкуКонвертации(ПутьКИсходникамОбработки, ПутьКФайлуОбработки); + + Сообщить("Запаковываю обработку конвертации в класс"); + + КомандаOpm = Новый Команда; + КомандаOpm.УстановитьКоманду("opm"); + КомандаOpm.ДобавитьПараметр("run packdata"); + + КодВозврата = КомандаOpm.Исполнить(); + + Если КодВозврата <> 0 Тогда + ВызватьИсключение КомандаOpm.ПолучитьВывод(); + КонецЕсли; КонецПроцедуры @@ -42,17 +56,20 @@ КонецПроцедуры Описание.Имя("v8storage") - .Версия("0.6.5") - .ВерсияСреды("1.0.18") + .Версия("0.6.6") + .ВерсияСреды("1.0.19") .ЗависитОт("asserts") .ЗависитОт("json") - .ЗависитОт("v8runner") - .ЗависитОт("logos") + .ЗависитОт("v8runner", "1.1.3") + .ЗависитОт("logos", "1.2.0") .ЗависитОт("fs") .ЗависитОт("tempfiles") .ВключитьФайл("src") .ВключитьФайл("bin") - .ВключитьФайл("lib.config") + //.ВключитьФайл("docs") + .ОпределяетКласс("МенеджерХранилищаКонфигурации", "src/Классы/МенеджерХранилищаКонфигурации.os") + .ОпределяетКласс("СоответствияНазванийВидовОбъектов", "src/Классы/СоответствияНазванийВидовОбъектов.os") + .ОпределяетКласс("СписокОбъектовКонфигурации", "src/Классы/СписокОбъектовКонфигурации.os") .ВключитьФайл("README.md") - .ВключитьФайл("LICENSE.md") + .ВключитьФайл("LICENSE") \ No newline at end of file diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..7367a7f --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,18 @@ +# must be unique in a given SonarQube instance +sonar.projectKey=opensource-v8storage +sonar.organization=sonar-opensource-add + +# this is the name displayed in the SonarQube UI +sonar.projectName=Command runner for 1S v8 storage for OScript + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +# Since SonarQube 4.2, this property is optional if sonar.modules is set. +# If not set, SonarQube starts looking for source code from the directory containing +# the sonar-project.properties file. + +sonar.sources=./src + +# Encoding of the source code. Default is default system encoding +sonar.sourceEncoding=UTF-8 + +sonar.coverageReportPaths=coverage/genericCoverage.xml diff --git a/sonar-qube.sh b/sonar-qube.sh new file mode 100755 index 0000000..f56f2f2 --- /dev/null +++ b/sonar-qube.sh @@ -0,0 +1,22 @@ +temp=`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'` +version=${temp##*|} + +if [ "$TRAVIS_SECURE_ENV_VARS" == "true" ]; then + if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + sonar-scanner \ + -Dsonar.host.url=https://sonar.silverbulleters.org \ + -Dsonar.analysis.mode=issues \ + -Dsonar.github.pullRequest=$TRAVIS_PULL_REQUEST \ + -Dsonar.github.repository=$TRAVIS_REPO_SLUG \ + -Dsonar.github.oauth=$GITHUB_OAUTH_TOKEN \ + -Dsonar.login=$SONAR_TOKEN \ + -Dsonar.scanner.skip=false + + elif [ "$TRAVIS_BRANCH" == "develop" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + sonar-scanner \ + -Dsonar.host.url=https://sonar.silverbulleters.org \ + -Dsonar.login=$SONAR_TOKEN \ + -Dsonar.projectVersion=$version\ + -Dsonar.scanner.skip=false + fi +fi \ No newline at end of file diff --git a/sonarlint.json b/sonarlint.json new file mode 100644 index 0000000..40edb6a --- /dev/null +++ b/sonarlint.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://raw.githubusercontent.com/silverbulleters/sonarqube-inject-vsc/master/schemas/sonarlint.json", + "serverId": "SB", + "projectKey": "opensource-v8storage" +} \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\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\227\320\260\320\277\320\260\320\272\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262V8Storage.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\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\227\320\260\320\277\320\260\320\272\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262V8Storage.os" new file mode 100644 index 0000000..1c40ced --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\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\227\320\260\320\277\320\260\320\272\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\244\320\260\320\271\320\273\320\276\320\262V8Storage.os" @@ -0,0 +1,8 @@ +Функция ПолучитьИндексФайлов() Экспорт + + ИндексФайлов = Новый Соответствие; + ИндексФайлов.Вставить("ОбработкаКонвертацииMXLJSON.epf", "ОбработкаКонвертацииMXLJSON_v8storage"); + + Возврат ИндексФайлов; + +КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON_v8storage.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON_v8storage.os" new file mode 100644 index 0000000..4707a09 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270MXLJSON_v8storage.os" @@ -0,0 +1,34 @@ + +/////////////////////////////////////////// +// ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ // +/////////////////////////////////////////// +// +// ФАЙЛ: <ОбработкаКонвертацииMXLJSON.epf> +// + +// Возвращает версию запакованного файла +// +Функция Версия() Экспорт + Возврат "1.0.0"; +КонецФункции + +// Возвращает имя запакованного файла +// +Функция ИмяФайла() Экспорт + Возврат "ОбработкаКонвертацииMXLJSON.epf"; +КонецФункции + +// Возвращает хеш строку запакованного файла +// +Функция Хеш() Экспорт + Возврат "2AFEE21213E3F6BD1573C9B04C67B547"; +КонецФункции + +// Возвращает запакованные данные файла +// +Функция ДвоичныеДанные() Экспорт + ЗапакованныеДанные = "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"; + Возврат ЗапакованныеДанные; +КонецФункции + + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270XMLJSON.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270XMLJSON.os" new file mode 100644 index 0000000..43b3404 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\232\320\276\320\275\320\262\320\265\321\200\321\202\320\260\321\206\320\270\320\270XMLJSON.os" @@ -0,0 +1,87 @@ +Перем ПутьКФайлу; + +#Область ПрограммныйИнтерфейс + +Функция ПолучитьПутьКФайлу(Знач ИмяФайла) Экспорт + + Если Не ПустаяСтрока(ПутьКФайлу) Тогда + Возврат ПутьКФайлу; + КонецЕсли; + + МенеджерЗапакованныхФайлов = Новый МенеджерЗапакованныхФайловV8Storage; + ИндексФайлов = МенеджерЗапакованныхФайлов.ПолучитьИндексФайлов(); + + ИмяКлассаФайла = ИндексФайлов[ИмяФайла]; + + Если ИмяКлассаФайла = Неопределено Тогда + ВызватьИсключение СтрШаблон("Не удалось найти двоичные данные для файла <%1>", ИмяФайла); + КонецЕсли; + + КлассФайла = Новый (ИмяКлассаФайла); + + ПутьКФайлу = ""; + + НайтиФайлИлиРаспаковать(КлассФайла, ПутьКФайлу); + + Возврат ПутьКФайлу; + +КонецФункции + +#КонецОбласти + +#Область Упакованные_файлы + +Процедура РаспаковатьДанные(Знач ПутьКФайлу, КлассФайла) + + ДвоичныеДанные = Base64Значение(КлассФайла.ДвоичныеДанные()); + + ОбеспечитьКаталог(ПутьКФайлу); + + ДвоичныеДанные.Записать(ПутьКФайлу); + +КонецПроцедуры + +Функция ВычислитьХешФайла(Знач ПутьКФайлу) + + ХешФайла = Новый ХешированиеДанных(ХешФункция.MD5); + ХешФайла.ДобавитьФайл(ПутьКФайлу); + + Возврат ХешФайла.ХешСуммаСтрокой; + +КонецФункции + +Процедура НайтиФайлИлиРаспаковать(КлассФайла, ПутьКФайлу) + + ИмяФайла = КлассФайла.ИмяФайла(); + + ПутьКФайлу = ПолучитьПутьКВременномуФайлу(ИмяФайла); + + ВременныйФайл = Новый Файл(ПутьКФайлу); + + Если Не ВременныйФайл.Существует() + Тогда// ИЛИ Не ВычислитьХешФайла(ПутьКФайлу) = ДанныеDll.Хеш() Тогда + РаспаковатьДанные(ПутьКФайлу, КлассФайла); + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьПутьКВременномуФайлу(Знач ИмяФайла) + ПутьКФайлу = ОбъединитьПути(КаталогВременныхФайлов(), ".gitsync-plugins", ИмяФайла); + Возврат ПутьКФайлу; +КонецФункции + +Процедура ОбеспечитьКаталог(ПутьККаталогу) + + ВременныйКаталог = Новый Файл(ПутьККаталогу); + + Если ВременныйКаталог.Существует() Тогда + Возврат; + КонецЕсли; + + СоздатьКаталог(ВременныйКаталог.Путь); + +КонецПроцедуры + +#КонецОбласти + +ПутьКФайлу = ""; \ No newline at end of file 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\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\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.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\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\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.os" index e1fd9f0..6f68752 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\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\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.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\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\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.os" @@ -4,6 +4,7 @@ #Использовать asserts #Использовать v8runner #Использовать json +#Использовать "./internal" Перем Лог; Перем ЭтоWindows; @@ -15,24 +16,27 @@ Перем ПарсерJSON; Перем ПутьКОбработкеКонвертации; Перем ЧтениеХранилищаВыполнено; -Перем ОбработкаКонвертацииОтчетаСобрана; +Перем ОбработкаКонвертации; Процедура ПриСозданииОбъекта(Знач НовыйПутьКХранилищу = Неопределено, НовыйУправлениеКонфигуратором = Неопределено) - - Если НовыйУправлениеКонфигуратором = Неопределено Тогда - УправлениеКонфигураторомХранилища = Новый УправлениеКонфигуратором(); - ВременныйКаталог = ВременныеФайлы.СоздатьКаталог(); - УправлениеКонфигураторомХранилища.КаталогСборки(ВременныйКаталог); - УправлениеКонфигураторомХранилища.УстановитьКодЯзыка("RU"); - Иначе - УстановитьУправлениеКонфигуратором(НовыйУправлениеКонфигуратором); - КонецЕсли; - - Если Не НовыйПутьКХранилищу = Неопределено Тогда - УстановитьПутьКХранилищу(НовыйПутьКХранилищу); - КонецЕсли; - - КонецПроцедуры + + Если НовыйУправлениеКонфигуратором = Неопределено Тогда + НовыйУправлениеКонфигуратором = Новый УправлениеКонфигуратором(); + ВременныйКаталог = ВременныеФайлы.СоздатьКаталог(); + НовыйУправлениеКонфигуратором.КаталогСборки(ВременныйКаталог); + НовыйУправлениеКонфигуратором.УстановитьКодЯзыка("RU"); + УстановитьУправлениеКонфигуратором(НовыйУправлениеКонфигуратором); + Иначе + УстановитьУправлениеКонфигуратором(НовыйУправлениеКонфигуратором); + КонецЕсли; + + Если Не НовыйПутьКХранилищу = Неопределено Тогда + УстановитьПутьКХранилищу(НовыйПутьКХранилищу); + КонецЕсли; + + Инициализация(); + +КонецПроцедуры // Установка каталога файлового хранилища конфигурации // @@ -73,6 +77,9 @@ // Получает управления конфигуратором используемое в менеджере хранилища конфигурации // +// Возвращаемое значение: +// Объект.УправлениеКонфигуратором - ссылка на класс <УправлениеКонфигуратором> +// Функция ПолучитьУправлениеКонфигуратором() Экспорт Возврат УправлениеКонфигураторомХранилища; @@ -82,17 +89,17 @@ // Обновление базы на определенную версию конфигурации из хранилища // // Параметры: -// НомерВерсии - число/строка - номер версии в хранилище +// НомерВерсии - Число, Строка - номер версии в хранилище // Процедура ОбновитьКонфигурациюНаВерсию(Знач НомерВерсии = "") Экспорт - + Параметры = СтандартныеПараметрыЗапуска(); - + Параметры.Добавить("/ConfigurationRepositoryUpdateCfg"); Если ЗначениеЗаполнено(НомерВерсии) Тогда Параметры.Добавить("-v "+ Строка(НомерВерсии)); КонецЕсли; - + Параметры.Добавить("-force"); Попытка @@ -110,10 +117,10 @@ // // Параметры: // ПутьКФайлуСоСпискомОбъектов - Строка - Строка путь к файлу xml c содержанием в формате http://its.1c.ru/db/v839doc#bookmark:adm:TI000000712 -// путь к файлу формата XML со списком объектов. Если опция используется, будет выполнена попытка захватить только объекты, -// указанные в файле. Если опция не используется, будут захвачены все объекты конфигурации. -// Если в списке указаны объекты, захваченные другим пользователем, эти объекты не будут захвачены и будет выдана ошибка. -// При этом доступные для захвата объекта будут захвачены. Подробнее о формате файла см в документации. +// путь к файлу формата XML со списком объектов. Если опция используется, будет выполнена попытка захватить только объекты, +// указанные в файле. Если опция не используется, будут захвачены все объекты конфигурации. +// Если в списке указаны объекты, захваченные другим пользователем, эти объекты не будут захвачены и будет выдана ошибка. +// При этом доступные для захвата объекта будут захвачены. Подробнее о формате файла см в документации. // ПолучатьЗахваченныеОбъекты - булево - Флаг получения захваченных объектов (По умолчанию равно "Ложь") // Процедура ЗахватитьОбъектыВХранилище(Знач ПутьКФайлуСоСпискомОбъектов = "", @@ -132,7 +139,6 @@ КонецЕсли; УправлениеКонфигураторомХранилища.ВыполнитьКоманду(Параметры); - ВыводКоманды = УправлениеКонфигураторомХранилища.ВыводКоманды(); КонецПроцедуры // ЗахватитьОбъектыВХранилище() @@ -140,12 +146,12 @@ // // Параметры: // СписокОбъектов - Строка - Строка путь к файлу xml c содержанием в формате http://its.1c.ru/db/v839doc#bookmark:adm:TI000000712 -// Если опция используется, будет выполнена попытка отменить захват только для объектов, указанных в файле. -// Если опция не используется, захват будет отменен для всех объектов конфигурации. -// При наличии в списке объектов, не захваченных текущим пользователем или захваченных другим пользователем, ошибка выдана не будет +// Если опция используется, будет выполнена попытка отменить захват только для объектов, указанных в файле. +// Если опция не используется, захват будет отменен для всех объектов конфигурации. +// При наличии в списке объектов, не захваченных текущим пользователем или захваченных другим пользователем, ошибка выдана не будет // ИгнорироватьИзменения - булево - Флаг игнорирования локальных изменений (По умолчанию равно "Ложь") -// Локально измененные объекты будут получены из хранилища, и внесенные изменения будут потеряны. -// Если опция не указана, то при наличии локально измененных объектов операция будет отменена и будет выдана ошибка. +// Локально измененные объекты будут получены из хранилища, и внесенные изменения будут потеряны. +// Если опция не указана, то при наличии локально измененных объектов операция будет отменена и будет выдана ошибка. // Процедура ОтменитьЗахватОбъектовВХранилище(Знач СписокОбъектов = Неопределено, Знач ИгнорироватьИзменения = Ложь) Экспорт @@ -163,20 +169,24 @@ КонецЕсли; УправлениеКонфигураторомХранилища.ВыполнитьКоманду(Параметры); - ВыводКоманды = УправлениеКонфигураторомХранилища.ВыводКоманды(); + КонецПроцедуры // ВыполнитьОтменуЗахватаВХранилище() // Помещение изменений объектов в хранилище конфигурации // // Параметры: -// СписокОбъектов - Строка - Строка путь к файлу xml c содержанием в формате http://its.1c.ru/db/v839doc#bookmark:adm:TI000000712 +// СписокОбъектов - Строка - Строка путь к файлу xml c содержанием в формате +// http://its.1c.ru/db/v839doc#bookmark:adm:TI000000712 // Если опция используется, будет выполнена попытка поместить только объекты, указанные в файле. // Если опция не используется, будут помещены изменения всех объектов конфигурации. -// При наличии в списке объектов, не захваченных текущим пользователем или захваченных другим пользователем, ошибка выдана не будет -// Комментарий - Строка - Комментарий к помещаемым. Чтобы установить многострочный комментарий, для каждой строки следует использовать свою опцию comment. +// При наличии в списке объектов, не захваченных текущим пользователем +// или захваченных другим пользователем, ошибка выдана не будет +// Комментарий - Строка - Комментарий к помещаемым. Чтобы установить многострочный комментарий, +// для каждой строки следует использовать свою опцию comment. // ОставитьОбъектыЗахваченными - булево - оставлять захват для помещенных объектов. // ИгнорироватьУдаленные - булево - Флаг игнорирования удаления объектов. По умолчанию = Ложь -// Если опция используется, при обнаружении ссылок на удаленные объекты будет выполнена попытка их очистить. +// Если опция используется, при обнаружении ссылок на удаленные объекты будет +// выполнена попытка их очистить. // Если опция не указана, при обнаружении ссылок на удаленные объекты будет выдана ошибка. // Процедура ПоместитьИзмененияОбъектовВХранилище(Знач СписокОбъектов = Неопределено, @@ -214,6 +224,9 @@ // Возвращает вывод выполнения команды конфигуратора // +// Возвращаемое значение: +// Строка - вывод выполнения команды конфигуратора +// Функция ПолучитьВыводКоманды() Экспорт Возврат УправлениеКонфигураторомХранилища.ВыводКоманды(); @@ -234,7 +247,7 @@ Параметры.Добавить("-ChangesAllowedRule ObjectNotSupported"); Параметры.Добавить("-ChangesNotRecommendedRule ObjectNotSupported"); - Если ПодключитьБазуКхранилищу = Ложь Тогда + Если ПодключитьБазуКхранилищу Тогда Параметры.Добавить("-NoBind"); КонецЕсли; @@ -245,11 +258,11 @@ // Установка метки для версии хранилища // // Параметры: -// Метка - Строка - текст метки -// Комментарий - Строка - текст комментария к устанавливаемой метки. -// Версия - Строка - номер версии хранилища, для которого устанавливается метка. -// Если версия не указана, метка ставится для самой последнее версии хранилища. -// Если указана несуществующая версия, выдается ошибка +// Метка - Строка - текст метки +// Комментарий - Строка - текст комментария к устанавливаемой метки. +// Версия - Строка - номер версии хранилища, для которого устанавливается метка. +// Если версия не указана, метка ставится для самой последнее версии хранилища. +// Если указана несуществующая версия, выдается ошибка // Процедура УстановитьМеткуДляВерсииВХранилище(Знач Метка, Знач Комментарий = "", @@ -278,18 +291,19 @@ КонецПроцедуры // УстановитьМеткуДляВерсииВХранилище() // Добавление пользователя хранилища конфигурации. -// Пользователь, от имени которого выполняется подключение к хранилищу, должен обладать административными правами. -// Если пользователь с указанным именем существует, то пользователь добавлен не будет. +// Пользователь, от имени которого выполняется подключение к хранилищу, должен обладать административными правами. +// Если пользователь с указанным именем существует, то пользователь добавлен не будет. +// // Параметры: // НовыйПользователь - Строка - Имя создаваемого пользователя. // ПарольПользователя - Строка - Пароль создаваемого пользователя. // Право - ПраваПользователяХранилища - Права пользователя. Возможные значения: -// ТолькоЧтение — право на просмотр, (по умолчанию) -// ПравоЗахватаОбъектов — право на захват объектов, -// ПравоИзмененияВерсий — право на изменение состава версий, -// Администрирование — право на административные функции. -// ВосстановитьУдаленного - Булево - флаг небходимости востановления удаленного пользователя -// Если обнаружен удаленный пользователь с таким же именем, он будет восстановлен. +// ТолькоЧтение — право на просмотр, (по умолчанию) +// ПравоЗахватаОбъектов — право на захват объектов, +// ПравоИзмененияВерсий — право на изменение состава версий, +// Администрирование — право на административные функции. +// ВосстановитьУдаленного - Булево - флаг небходимости востановления удаленного пользователя +// Если обнаружен удаленный пользователь с таким же именем, он будет восстановлен. // Процедура ДобавитьПользователяВХранилище(Знач НовыйПользователь, Знач ПарольПользователя = "", @@ -299,16 +313,16 @@ Параметры = СтандартныеПараметрыЗапуска(); Параметры.Добавить("/ConfigurationRepositoryAddUser "); - Параметры.Добавить(СтрШаблон("-User ""%1""",НовыйПользователь)); + Параметры.Добавить(СтрШаблон("-User ""%1""", НовыйПользователь)); Если Не ПустаяСтрока(ПарольПользователя) Тогда - Параметры.Добавить(СтрШаблон("-Pwd ""%1""",ПарольПользователя)); + Параметры.Добавить(СтрШаблон("-Pwd ""%1""", ПарольПользователя)); КонецЕсли; - Если Не ЗначениеЗаполнено(Право) ТОгда + Если Не ЗначениеЗаполнено(Право) Тогда Право = ПраваПользователяХранилища().ТолькоЧтение; КонецЕсли; - Параметры.Добавить(СтрШаблон("-Rights %1",Право)); + Параметры.Добавить(СтрШаблон("-Rights %1", Право)); Если ВосстановитьУдаленного Тогда Параметры.Добавить("-RestoreDeletedUser"); @@ -321,7 +335,7 @@ // Копирование пользователей из хранилища конфигурации. Копирование удаленных пользователей не выполняется. // Если пользователь с указанным именем существует, то пользователь не будет добавлен. // -//Параметры: +// Параметры: // СтрокаСоединенияХранилищаКопии - Строка - Путь к хранилищу, из которого выполняется копирование пользователей. // ПользовательХранилищаКопии - Строка - Имя пользователя хранилища, из которого выполняется копирование пользователей. // ПарольХранилищаКопии - Строка - Пароль пользователя хранилища, из которого выполняется копирование пользователей. @@ -335,10 +349,10 @@ Параметры = СтандартныеПараметрыЗапуска(); Параметры.Добавить("/ConfigurationRepositoryCopyUsers "); - Параметры.Добавить(СтрШаблон("-Path ""%1""",СтрокаСоединенияХранилищаКопии)); - Параметры.Добавить(СтрШаблон("-User ""%1""",ПользовательХранилищаКопии)); + Параметры.Добавить(СтрШаблон("-Path ""%1""", СтрокаСоединенияХранилищаКопии)); + Параметры.Добавить(СтрШаблон("-User ""%1""", ПользовательХранилищаКопии)); Если Не ПустаяСтрока(ПарольХранилищаКопии) Тогда - Параметры.Добавить(СтрШаблон("-Pwd ""%1""",ПарольХранилищаКопии)); + Параметры.Добавить(СтрШаблон("-Pwd ""%1""", ПарольХранилищаКопии)); КонецЕсли; Если ВосстановитьУдаленного Тогда @@ -352,7 +366,7 @@ // Сохранение в файл версии конфигурации из хранилища // // Параметры: -// НомерВерсии - число/строка - номер версии в хранилище +// НомерВерсии - число, строка - номер версии в хранилище // ИмяФайлаКофигурации - строка - путь к файлу в который будет сохранена версия конфигурации из хранилища // Процедура СохранитьВерсиюКонфигурацииВФайл(Знач НомерВерсии, Знач ИмяФайлаКофигурации) Экспорт @@ -362,7 +376,7 @@ Параметры.Добавить(СтрШаблон("/ConfigurationRepositoryDumpCfg ""%1""", ИмяФайлаКофигурации)); Если Не ПустаяСтрока(НомерВерсии) Тогда - Параметры.Добавить("-v "+НомерВерсии); + Параметры.Добавить("-v " + НомерВерсии); КонецЕсли; УправлениеКонфигураторомХранилища.ВыполнитьКоманду(Параметры); @@ -371,6 +385,7 @@ // Сохранение в файл последней версии конфигурации из хранилища // (обертка над процедурой "СохранитьВерсиюКонфигурацииВФайл") +// // Параметры: // ИмяФайлаКофигурации - строка - путь к файлу в который будет сохранена версия конфигурации из хранилища // @@ -407,8 +422,8 @@ // Получение таблицы истории версий из хранилища // (выполняет ПрочитатьХранилище(1), если еще не было чтения) // -// Возвращаемое значение таблица значений: -// Колонки: +// Возвращаемое значение: +// таблица значений - колонки: // Номер - число - номер версии // Дата - Дата - Дата версии // Автор - строка - автор версии @@ -420,14 +435,13 @@ Возврат ТаблицаВерсий; - -КонецФункции // ПолучитьТаблицуВерсий() Экспорт +КонецФункции // Получение массива авторов версий из хранилища // (выполняет ПрочитатьХранилище(1), если еще не было чтения) // -// Возвращаемое значение массив: -// Автор - строка - используемые авторы в хранилище +// Возвращаемое значение: +// Массив - Автор - строка - используемые авторы в хранилище // Функция ПолучитьАвторов() Экспорт @@ -435,8 +449,7 @@ Возврат МассивАвторов; - -КонецФункции // ПолучитьТаблицаВерсий() Экспорт +КонецФункции // Получение отчет по истории версий из хранилища // @@ -452,15 +465,15 @@ Параметры = СтандартныеПараметрыЗапуска(); - Параметры.Добавить("/ConfigurationRepositoryReport """+ПутьКФайлуРезультата + """"); + Параметры.Добавить("/ConfigurationRepositoryReport """ + ПутьКФайлуРезультата + """"); - Параметры.Добавить("-NBegin "+НомерНачальнойВерсии); + Параметры.Добавить("-NBegin " + НомерНачальнойВерсии); Если ЗначениеЗаполнено(НомерКонечнойВерсии) Тогда - Параметры.Добавить("-NEnd "+НомерКонечнойВерсии); + Параметры.Добавить("-NEnd " + НомерКонечнойВерсии); - КонецЕслИ; + КонецЕсли; УправлениеКонфигураторомХранилища.ВыполнитьКоманду(Параметры); @@ -469,10 +482,14 @@ // Выполняет подключение ранее неподключенной информационной базы к хранилищу конфигурации. // // Параметры: -// ИгнорироватьНаличиеПодключеннойБД - Булево - Флаг игнорирования наличия уже у пользователя уже подключенной базы данных. По умолчанию = Ложь -// Выполняет подключение даже в том случае, если для данного пользователя уже есть конфигурация, связанная с данным хранилищем.. +// ИгнорироватьНаличиеПодключеннойБД - Булево - Флаг игнорирования наличия у пользователя уже подключенной базы данных. +// По умолчанию = Ложь +// Выполняет подключение даже в том случае, +// если для данного пользователя уже есть конфигурация, +// связанная с данным хранилищем. // ЗаменитьКонфигурациюБД - Булево - Флаг замены конфигурации БД на конфигурацию хранилища (По умолчанию Истина) -// Если конфигурация непустая, данный ключ подтверждает замену конфигурации на конфигурацию из хранилища. +// Если конфигурация непустая, данный ключ подтверждает замену конфигурации +// на конфигурацию из хранилища. // Процедура ПодключитьсяКХранилищу(Знач ИгнорироватьНаличиеПодключеннойБД = Ложь, Знач ЗаменитьКонфигурациюБД = Истина) Экспорт @@ -516,23 +533,28 @@ // Получение отчет по истории версий из хранилища // // Параметры: -// ПутьКФайлуРезультата - Строка - путь к файлу отчета в формате mxl +// ПутьКФайлуОтчета - Строка - путь к файлу отчета в формате mxl // ПутьКФайлуОтчетаJSON - Строка - путь к файлу в который будет выгружен отчет в формате json, // Процедура СконвертироватьОтчет(Знач ПутьКФайлуОтчета, Знач ПутьКФайлуОтчетаJSON) Экспорт КлючЗапуска = СтрШаблон("""%1;%2""", ПутьКФайлуОтчета, ПутьКФайлуОтчетаJSON); - ПараметрыЗапускаОбработки = СтрШаблон("/Execute ""%1""", ПолучитьОбработкуКонвертацииОтчета()); + + ПутьКФайлуОбработки = ОбработкаКонвертации.ПолучитьПутьКФайлу("ОбработкаКонвертацииMXLJSON.epf"); + + ПараметрыЗапускаОбработки = СтрШаблон("/Execute ""%1""", ПутьКФайлуОбработки); УправлениеКонфигураторомХранилища.ЗапуститьВРежимеПредприятия(КлючЗапуска, Ложь, ПараметрыЗапускаОбработки); КонецПроцедуры // Возвращает структура возможных прав пользователя в хранилище конфигурации -// Ключи структуры: -// ТолькоЧтение — право на просмотр, (по умолчанию) -// ПравоЗахватаОбъектов — право на захват объектов, -// ПравоИзмененияВерсий — право на изменение состава версий, -// Администрирование — право на административные функции. +// +// Возвращаемое значение: +// Структура - Ключи структуры: +// ТолькоЧтение — право на просмотр, (по умолчанию) +// ПравоЗахватаОбъектов — право на захват объектов, +// ПравоИзмененияВерсий — право на изменение состава версий, +// Администрирование — право на административные функции. // Функция ПраваПользователяХранилища() Экспорт @@ -547,10 +569,7 @@ КонецФункции // ПраваПользователяХранилища() - -////////////////////////////// -// Вспомогательные процедуры и функции - +#Область Вспомогательные_процедуры_и_функции Процедура ПроверитьЗагрузкуДанныхХранилища() @@ -568,21 +587,20 @@ ТаблицаВерсий.Колонки.Добавить("Автор"); ТаблицаВерсий.Колонки.Добавить("Комментарий"); - Для Каждого ВерсияМассива из МассивВерсий Цикл + Для Каждого ВерсияМассива Из МассивВерсий Цикл НоваяСтрока = ТаблицаВерсий.Добавить(); НоваяСтрока.Номер = ВерсияМассива["Номер"]; - НоваяСтрока.Дата = XMLЗначение(Тип("Дата"),ВерсияМассива["Дата"]); + НоваяСтрока.Дата = XMLЗначение(Тип("Дата"), ВерсияМассива["Дата"]); НоваяСтрока.Автор = ВерсияМассива["Автор"]; НоваяСтрока.Комментарий = ВерсияМассива["Комментарий"]; - КонецЦикла + КонецЦикла; КонецПроцедуры Функция ПрочитатьФайл(ПутьКФайлу) - ЧтениеТекстаФайла = Новый ЧтениеТекста(ПутьКФайлу, "utf-8"); Текст = ЧтениеТекстаФайла.Прочитать(); @@ -591,50 +609,14 @@ Если ПустаяСтрока(Текст) Тогда - ВызватьИсключение "Из файла ничего не прочитано" - - Иначе - - Возврат Текст; - - КонецЕсли; - -КонецФункции - -Функция ПолучитьОбработкуКонвертацииОтчета() - - Если НЕ ОбработкаКонвертацииОтчетаСобрана Тогда - - СобратьОбработкуКонвертацииОтчета(); + ВызватьИсключение "Из файла ничего не прочитано"; КонецЕсли; - Возврат ПутьКОбработкеКонвертации; + Возврат Текст; КонецФункции -Процедура СобратьОбработкуКонвертацииОтчета() - - ФайлОбработки = Новый Файл(ПутьКОбработкеКонвертации); - - Если ФайлОбработки.Существует() Тогда - Лог.Отладка("Найдена готовая обработка по пути: %1", ПутьКОбработкеКонвертации ); - ОбработкаКонвертацииОтчетаСобрана = Истина; - - Возврат; - - КонецЕсли; - Лог.Отладка("Не найдена готовая обработка по пути: %1 - | делаю попытку собрать временную обработку исходников", ПутьКОбработкеКонвертации ); - - ПутьКОбработкеКонвертации = ВременныеФайлы.НовоеИмяФайла("epf"); - - СобратьОбработкуКонвертации(ОбъединитьПути(ТекущийСценарий().Каталог,"../../epf/ОбработкаКонвертацииMXLJSON/ОбработкаКонвертацииMXLJSON.xml"), ПутьКОбработкеКонвертации); - - ОбработкаКонвертацииОтчетаСобрана = Истина; - -КонецПроцедуры - Функция СтандартныеПараметрыЗапуска() ПараметрыЗапуска = УправлениеКонфигураторомХранилища.ПолучитьПараметрыЗапуска(); @@ -660,11 +642,11 @@ // ТекстЛога - строка - строка вывода результат выполенния команды захвата в хранилище // // Возвращаемое значение: -// ТаблицаЗначений: +// ТаблицаЗначений - колонки // ПолноеИмя - строка - например, Документы.Документ1.Формы.ФормаДокумента1 // ЗахваченДляРедактирования - булево - признак успешного захвата в хранилище // -Функция ПолучитьТаблицуЗахваченныхОбъектов(ТекстЛога) Экспорт +Функция ПолучитьТаблицуЗахваченныхОбъектов(Знач ТекстЛога) Экспорт ЗахваченныеОбъекты = Новый ТаблицаЗначений; ЗахваченныеОбъекты.Колонки.Добавить("ПолноеИмя"); @@ -706,7 +688,6 @@ ОбъектЗахваченУспешно = СтрНачинаетсяС(СтрокаТекста, ТекстОбъектЗахваченУспешно); - // Если в пути к объекту нет точек, тогда это корень конфигурации, переименуем его. Если СтрНайти(ПутьОбъекта, ".") = 0 Тогда Лог.Отладка(СтрШаблон("Захвачен для редактирования корень конфигурации")); @@ -729,16 +710,21 @@ ПараметрыАвторизации = Новый Структура(); УстановитьПараметрыАвторизации(""); - ОбработкаКонвертацииОтчетаСобрана = Ложь; - ПутьКОбработкеКонвертации = ОбъединитьПути(ТекущийСценарий().Каталог,"../../bin/ОбработкаКонвертацииMXLJSON.epf"); + ОбработкаКонвертации = Новый ОбработкаКонвертацииXMLJSON; СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; ПарсерJSON = Новый ПарсерJSON(); ЧтениеХранилищаВыполнено = Ложь; - + КонецПроцедуры +// Выполняет сборку обработки из каталога исходников +// +// Параметры: +// ПапкаИсходников - Строка - путь к каталогу исходников обработки +// ИмяФайлаОбъекта - Строка - Путь к будущему файлу обработки +// Процедура СобратьОбработкуКонвертации(Знач ПапкаИсходников, Знач ИмяФайлаОбъекта) Экспорт Лог.Отладка("Собираю файл из исходников <%1> в файл %2", ПапкаИсходников, ИмяФайлаОбъекта); @@ -757,4 +743,4 @@ КонецПроцедуры -Инициализация(); \ No newline at end of file +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\321\217\320\235\320\260\320\267\320\262\320\260\320\275\320\270\320\271\320\222\320\270\320\264\320\276\320\262\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\321\217\320\235\320\260\320\267\320\262\320\260\320\275\320\270\320\271\320\222\320\270\320\264\320\276\320\262\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" index ea4024c..eed43dd 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\321\217\320\235\320\260\320\267\320\262\320\260\320\275\320\270\320\271\320\222\320\270\320\264\320\276\320\262\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\270\321\217\320\235\320\260\320\267\320\262\320\260\320\275\320\270\320\271\320\222\320\270\320\264\320\276\320\262\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262.os" @@ -1,5 +1,33 @@ Перем СоответствияНазванийВидовОбъектов; +// Возвращает представление для типа объекта +// +// Параметры: +// ЗначениеПоиска - Строка - значение для поиска +// КолонкаПоиска - Строка - колонка поиска имени на английском языке (по умолчанию <ИмяАнгл>) +// КолонкаИмени - Строка - колонка поиска имени (по умолчанию <Имя>) +// ЗначениеПоУмолчанию - Строка - Значение по умолчанию, если название на найдено +// +// Возвращаемое значение: +// Строка - найденное название для вида объекта +// +Функция ПолучитьСоответствиеНазванияВидаОбъекта(ЗначениеПоиска, + КолонкаПоиска = "ИмяАнгл", + КолонкаИмени = "Имя", + ЗначениеПоУмолчанию = Неопределено) Экспорт + + СтандартныйТип = СоответствияНазванийВидовОбъектов.Найти(ЗначениеПоиска, КолонкаПоиска); + + Если СтандартныйТип = Неопределено Тогда + Возврат ?(ЗначениеПоУмолчанию = Неопределено, ЗначениеПоиска, ЗначениеПоУмолчанию); + КонецЕсли; + + Возврат СтандартныйТип[КолонкаИмени]; + +КонецФункции + +#Область Инициализация + Функция СоответствияНазванийВидовОбъектовИнициализировать() Если ТипЗнч(СоответствияНазванийВидовОбъектов) = Тип("ТаблицаЗначений") Тогда @@ -891,13 +919,6 @@ КонецФункции -Функция ПолучитьСоответствиеНазванияВидаОбъекта(ЗначениеПоиска, КолонкаПоиска = "ИмяАнгл", КолонкаИмени = "Имя", ЗначениеПоУмолчанию = Неопределено) Экспорт - - СтандартныйТип = СоответствияНазванийВидовОбъектов.Найти(ЗначениеПоиска, КолонкаПоиска); - Возврат ?(СтандартныйТип = Неопределено, - ?(ЗначениеПоУмолчанию = Неопределено, ЗначениеПоиска, ЗначениеПоУмолчанию), - СтандартныйТип[КолонкаИмени]); - -КонецФункции +#КонецОбласти СоответствияНазванийВидовОбъектовИнициализировать(); \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\277\320\270\321\201\320\276\320\272\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\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\241\320\277\320\270\321\201\320\276\320\272\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\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 73e6988..223d41a 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\277\320\270\321\201\320\276\320\272\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\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\241\320\277\320\270\321\201\320\276\320\272\320\236\320\261\321\212\320\265\320\272\321\202\320\276\320\262\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" @@ -4,13 +4,15 @@ Перем СтруктураСпискаОбъектов; Перем Лог; -// Возвращает таблицу объектов следующего формата -// ТаблицаЗначений: -// ПолноеИмя - строка - например, Документы.Документ1.Формы.ФормаДокумента1 -// ПолноеИмяФайла - строка - путь к файлу исходников -// ПолноеИмяВоВторойКонфигурации - строка - аналогично, "ПолноеИмя" -// ВключатьПодчиненные - булево - признак включения в работу подчиненных объектов -// Подсистема - структура - ключи ТипКонфигурации, ВключитьВсеПодчиненныОбъекты +// Возвращает таблицу объектов +// +// Возвращаемое значение: +// ТаблицаЗначений - с колонками +// ПолноеИмя - строка - например, Документы.Документ1.Формы.ФормаДокумента1 +// ПолноеИмяФайла - строка - путь к файлу исходников +// ПолноеИмяВоВторойКонфигурации - строка - аналогично, "ПолноеИмя" +// ВключатьПодчиненные - булево - признак включения в работу подчиненных объектов +// Подсистема - структура - ключи ТипКонфигурации, ВключитьВсеПодчиненныОбъекты // Функция ПолучитьТаблицуОбъектов() Экспорт Возврат ТаблицаОбъектов; @@ -24,7 +26,10 @@ // ПолноеИмяФайла - строка - путь к файлу исходников // ПолноеИмяВоВторойКонфигурации - строка - аналогично, "ПолноеИмя" // -Процедура ДобавитьОбъектКонфигурации(Знач ПолноеИмя, Знач ВключатьПодчиненные = Ложь, Знач ПолноеИмяФайла, Знач ПолноеИмяВоВторойКонфигурации = "") Экспорт +Процедура ДобавитьОбъектКонфигурации(Знач ПолноеИмя, + Знач ВключатьПодчиненные = Ложь, + Знач ПолноеИмяФайла, + Знач ПолноеИмяВоВторойКонфигурации = "") Экспорт ДобавитьОбъект(ПолноеИмя, ВключатьПодчиненные, @@ -42,7 +47,10 @@ // Процедура ДобавитьОписаниеКонфигурации(Знач ПолноеИмя, Знач ВключатьПодчиненные = Ложь, Знач ПолноеИмяФайла = "") Экспорт - СтруктураСпискаОбъектов.Вставить("Конфигурация", Новый Структура("ПолноеИмя, ВключатьПодчиненные, ПолноеИмяФайла", ПолноеИмя, ВключатьПодчиненные, ПолноеИмяФайла)); + СтруктураСпискаОбъектов.Вставить("Конфигурация", + Новый Структура("ПолноеИмя, ВключатьПодчиненные, ПолноеИмяФайла", + ПолноеИмя, ВключатьПодчиненные, ПолноеИмяФайла + )); КонецПроцедуры @@ -51,7 +59,6 @@ // Параметры: // ПолноеИмя - строка - например, Документы.Документ1.Формы.ФормаДокумента1 // ВключатьПодчиненные - булево - признак включения в работу подчиненных объектов -// ПолноеИмяФайла - строка - путь к файлу исходников // ТипКонфигурации - строка - ?? // ПолноеИмяВоВторойКонфигурации - строка - аналогично, "ПолноеИмя" // ВключитьВсеПодчиненныОбъекты - булево - признак включения в работу всех объектов подчиненных подсистем @@ -86,7 +93,7 @@ Если ФайлОбъектов.Существует() Тогда - УдалитьФайлы(ПутьКФайлуОбъектов) + УдалитьФайлы(ПутьКФайлуОбъектов); КонецЕсли; @@ -102,7 +109,9 @@ Если СтруктураСпискаОбъектов.Свойство("Конфигурация") Тогда Лог.Отладка(СтрШаблон("Начинаю запись объекта: %1 ", СтруктураСпискаОбъектов.Конфигурация.ПолноеИмя)); ЗаписьXML.ЗаписатьНачалоЭлемента("Configuration"); - ЗаписьXML.ЗаписатьАтрибут("includeChildObjects", Формат(СтруктураСпискаОбъектов.Конфигурация.ВключатьПодчиненные, "БЛ=false; БИ=true")); + ЗаписьXML.ЗаписатьАтрибут("includeChildObjects", + Формат(СтруктураСпискаОбъектов.Конфигурация.ВключатьПодчиненные, + "БЛ=false; БИ=true")); ЗаписьXML.ЗаписатьКонецЭлемента(); КонецЕсли; @@ -112,11 +121,14 @@ ЗаписьXML.ЗаписатьНачалоЭлемента("Object"); ЗаписьXML.ЗаписатьАтрибут("fullName", СтрокаТаблицы.ПолноеИмя); - ЗаписьXML.ЗаписатьАтрибут("includeChildObjects", Формат(СтрокаТаблицы.ВключатьПодчиненные, "БЛ=false; БИ=true")); + ЗаписьXML.ЗаписатьАтрибут("includeChildObjects", Формат(СтрокаТаблицы.ВключатьПодчиненные, + "БЛ=false; БИ=true")); Если ТипЗнч(СтрокаТаблицы.Подсистема) = Тип("Структура") Тогда ДанныеПодсистемы = СтрокаТаблицы.Подсистема; ЗаписьXML.ЗаписатьНачалоЭлемента("Subsystem"); - ЗаписьXML.ЗаписатьАтрибут("includeObjectsFromSubordinateSubsystems", Формат((ДанныеПодсистемы.ВключитьВсеПодчиненныОбъекты),"БЛ=false; БИ=true")); + ЗаписьXML.ЗаписатьАтрибут("includeObjectsFromSubordinateSubsystems", Формат( + (ДанныеПодсистемы.ВключитьВсеПодчиненныОбъекты), + "БЛ=false; БИ=true")); Если ДанныеПодсистемы.Свойство("ТипКонфигурации") Тогда ЗаписьXML.ЗаписатьАтрибут("configuration", ДанныеПодсистемы.ТипКонфигурации); КонецЕсли; @@ -204,7 +216,9 @@ Функция СтруктураОбъектыПодсистема(Знач ТипКонфигурации = Неопределено, ВключитьВсеПодчиненныОбъекты = Ложь) - Возврат Новый Структура("ТипКонфигурации, ВключитьВсеПодчиненныОбъекты", ТипКонфигурации, ВключитьВсеПодчиненныОбъекты); + Возврат Новый Структура("ТипКонфигурации, ВключитьВсеПодчиненныОбъекты", + ТипКонфигурации, + ВключитьВсеПодчиненныОбъекты); КонецФункции // СтруктураОбъектыПодсистема() @@ -215,7 +229,10 @@ КонецПроцедуры -Функция ПолучитьПутьОбъектаИзФайлаВыгрузкиXML(Знач ПолноеИмяФайлаВыгрузкиXML, Знач Разделитель = ".", Знач КолонкаИмени = "Имя", Знач КаталогВыгрузкиРезультат = "") +Функция ПолучитьПутьОбъектаИзФайлаВыгрузкиXML(Знач ПолноеИмяФайлаВыгрузкиXML, + Знач Разделитель = ".", + Знач КолонкаИмени = "Имя", + Знач КаталогВыгрузкиРезультат = "") КешСоотвествияНазванийВидовОбъектов = Новый СоответствияНазванийВидовОбъектов(); ПолноеИмяФайлаВыгрузкиXML = СтрЗаменить(ПолноеИмяФайлаВыгрузкиXML, "\", "/"); @@ -241,7 +258,9 @@ // Для файлов конфигурации, лежащих в самом каталоге выгрузки, задаем имя объекта как "Конфигурация" (или "Configuration"). Если КоличествоЭлементовПутиАнгл < 2 Тогда - Возврат КешСоотвествияНазванийВидовОбъектов.ПолучитьСоответствиеНазванияВидаОбъекта("Конфигурация", "Имя", КолонкаИмени); + Возврат КешСоотвествияНазванийВидовОбъектов.ПолучитьСоответствиеНазванияВидаОбъекта("Конфигурация", + "Имя", + КолонкаИмени); КонецЕсли; ПутьФактический = ""; @@ -260,7 +279,9 @@ // Если элемент пути стоит на нечетном месте (нумерация с 1) в имени файла, // то ищем его эквивалент на русском языке в единственном числе. Если Счетчик % 2 = 1 Тогда - ЭлементПути = КешСоотвествияНазванийВидовОбъектов.ПолучитьСоответствиеНазванияВидаОбъекта(ЭлементПути, "ИмяАнглМнФормы", КолонкаИмени); + ЭлементПути = КешСоотвествияНазванийВидовОбъектов.ПолучитьСоответствиеНазванияВидаОбъекта(ЭлементПути, + "ИмяАнглМнФормы", + КолонкаИмени); КонецЕсли; // Четные элементы пути оставляем как есть - это наименования объектов метаданных. @@ -291,31 +312,6 @@ КонецФункции -Процедура ЗаменитьПутиФайловФормВТаблицеИзмененныхФайлов(ТаблицаФайлов, КаталогВыгрузкиРезультат) - - // Для форм заменяем путь к измененному файлу путем к файлу XML формы как к объекту метаданных, - // т.к. при указании, например, файла с модулем формы будет ошибка платформы при загрузке. - // Модуль формы будет загружен автоматически при указании файла XML формы. - Для Каждого СтрокаФайла Из ТаблицаФайлов Цикл - - КлассОбъекта = ПолучитьКлассОбъекта(СтрокаФайла.Объект); - Если (СтрСравнить(КлассОбъекта, "Форма") <> 0) - И (СтрСравнить(КлассОбъекта, "ОбщаяФорма") <> 0) Тогда - Продолжить; - КонецЕсли; - - ПутьОбъектаАнгл = ПолучитьПутьОбъектаИзФайлаВыгрузкиXML(СтрокаФайла.ПолноеИмяФайла,, "ИмяАнглМнФормы"); - ПутьОбъектаАнгл = СтрЗаменить(ПутьОбъектаАнгл, ".", "\"); - - ПолноеИмяФайлаФормы = КаталогВыгрузкиРезультат + ПутьОбъектаАнгл + ".xml"; - // Если апк_ФайлСуществует(ПолноеИмяФайлаФормы) Тогда - // СтрокаФайла.ПолноеИмяФайла = ПолноеИмяФайлаФормы; - // КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - Функция ПолучитьИмяФайлаБезРасширения(ПутьКФайлу) Файл = Новый Файл(ПутьКФайлу); diff --git a/tasks/coverage.os b/tasks/coverage.os index ee7a9c7..41f8364 100644 --- a/tasks/coverage.os +++ b/tasks/coverage.os @@ -1,7 +1,6 @@ +#Использовать coverage #Использовать 1commands -#Использовать asserts #Использовать fs -#Использовать json ФС.ОбеспечитьПустойКаталог("coverage"); ПутьКСтат = "coverage/stat.json"; @@ -10,58 +9,22 @@ Команда.УстановитьКоманду("oscript"); Команда.ДобавитьПараметр("-encoding=utf-8"); Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); -Команда.ДобавитьПараметр("tasks/test.os"); +Команда.ДобавитьПараметр("tasks/test.os"); +Команда.ПоказыватьВыводНемедленно(Истина); КодВозврата = Команда.Исполнить(); -Сообщить(Команда.ПолучитьВывод()); -Ожидаем.Что(КодВозврата).Равно(0); Файл_Стат = Новый Файл(ПутьКСтат); -Ожидаем.Что(Файл_Стат.Существует(), СтрШаблон("Файл <%1> с результатами покрытия не существует!", Файл_Стат.ПолноеИмя)).ЭтоИстина(); -ЧтениеТекста = Новый ЧтениеТекста(ПутьКСтат, КодировкаТекста.UTF8); +ИмяПакета = "cli"; -СтрокаJSON = ЧтениеТекста.Прочитать(); -ЧтениеТекста.Закрыть(); +ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); -Парсер = Новый ПарсерJSON(); -ДанныеПокрытия = Парсер.ПрочитатьJSON(СтрокаJSON); +ПроцессорГенерации.ОтносительныеПути() + .ФайлСтатистики(Файл_Стат.ПолноеИмя) + .GenericCoverage() + .Cobertura() + .Clover(ИмяПакета) + .Сформировать(); -ЗаписьXML = Новый ЗаписьXML; -ЗаписьXML.ОткрытьФайл("coverage/genericCoverage.xml"); -ЗаписьXML.ЗаписатьОбъявлениеXML(); -ЗаписьXML.ЗаписатьНачалоЭлемента("coverage"); -ЗаписьXML.ЗаписатьАтрибут("version", "1"); - -Для Каждого Файл Из ДанныеПокрытия Цикл - - ДанныеФайла = Файл.Значение; - - ЗаписьXML.ЗаписатьНачалоЭлемента("file"); - ЗаписьXML.ЗаписатьАтрибут("path", ДанныеФайла.Получить("#path")); - - Для Каждого КлючИЗначение Из ДанныеФайла Цикл - - Если КлючИЗначение.Ключ = "#path" Тогда - Продолжить; - КонецЕсли; - - ДанныеПроцедуры = КлючИЗначение.Значение; - Для Каждого ДанныеСтроки Из ДанныеПроцедуры Цикл - - ЗаписьXML.ЗаписатьНачалоЭлемента("lineToCover"); - - ЗаписьXML.ЗаписатьАтрибут("lineNumber", ДанныеСтроки.Ключ); - Покрыто = Число(ДанныеСтроки.Значение.Получить("count")) > 0; - ЗаписьXML.ЗаписатьАтрибут("covered", Формат(Покрыто, "БИ=true; БЛ=false")); - - ЗаписьXML.ЗаписатьКонецЭлемента(); // lineToCover - КонецЦикла - КонецЦикла; - - ЗаписьXML.ЗаписатьКонецЭлемента(); // file - -КонецЦикла; - -ЗаписьXML.ЗаписатьКонецЭлемента(); // coverage -ЗаписьXML.Закрыть(); +ЗавершитьРаботу(КодВозврата); \ No newline at end of file diff --git a/tasks/packdata.os b/tasks/packdata.os new file mode 100644 index 0000000..70224ab --- /dev/null +++ b/tasks/packdata.os @@ -0,0 +1,148 @@ +Перем ИндексКлассов; +Перем КаталогBin; +Перем КаталогКлассов; +Перем ПрефиксКлассов; +Перем ИмяМенеджераФайлов; + +Процедура ВыполнитьЗапаковку() + + ТекущийКаталогЗадачи = ТекущийСценарий().Каталог; + + КаталогПроекта = Новый Файл(ОбъединитьПути(ТекущийКаталогЗадачи, "..")).ПолноеИмя; + + ПрефиксКлассов = "v8storage"; + + КаталогКлассов = ОбъединитьПути(КаталогПроекта, "src/Классы/internal/Классы"); + КаталогBin = ОбъединитьПути(КаталогПроекта, "bin"); + + КаталогEpf = КаталогBin; + + ИмяМенеджераФайлов = "МенеджерЗапакованныхФайловV8Storage.os"; + + ИндексКлассов = Новый Соответствие; + ОбработатьКаталог(КаталогEpf, "*.epf"); + + ЗаписатьКлассИндексаЗапаковки(ИндексКлассов); + +КонецПроцедуры + +Процедура ЗаписатьКлассИндексаЗапаковки(ИндексКлассов) + + ТекстБлока = "Функция ПолучитьИндексФайлов() Экспорт + | + | ИндексФайлов = Новый Соответствие; + |"; + + ШаблонДобавленияВИндекс = " ИндексФайлов.Вставить(""%1"", ""%2"");"; + + Для каждого ДанныеКласса Из ИндексКлассов Цикл + + ТекстБлока = ТекстБлока + СтрШаблон(ШаблонДобавленияВИндекс, ДанныеКласса.Ключ, ДанныеКласса.Значение) + Символы.ПС; + + КонецЦикла; + + ТекстБлока = ТекстБлока + " + | Возврат ИндексФайлов; + | + |КонецФункции"; + + ФайлКлассаМенеджерЗапакованныхФайлов = ОбъединитьПути(КаталогКлассов, ИмяМенеджераФайлов); + + ЗаписьТекста = Новый ЗаписьТекста(ФайлКлассаМенеджерЗапакованныхФайлов); + ЗаписьТекста.ЗаписатьСтроку(ТекстБлока); + ЗаписьТекста.Закрыть(); + + Сообщить("Обработки запакованы в классы"); + +КонецПроцедуры + +Процедура ОбработатьКаталог(Знач КаталогОбработки, Знач МаскаПоискаФайлов) + + МассивНайденныхФайлов = НайтиФайлы(КаталогОбработки, МаскаПоискаФайлов); + + Для каждого НайденныйФайл Из МассивНайденныхФайлов Цикл + + Если НайденныйФайл.ЭтоКаталог() Тогда + Продолжить; + КонецЕсли; + + ИмяФайла = СтрЗаменить(НайденныйФайл.ИмяБезРасширения, ".", "_"); + ПолныйПутьКФайлу = НайденныйФайл.ПолноеИмя; + + ИмяКлассаФайла = СтрШаблон("%1_%2", ИмяФайла, ПрефиксКлассов); + + ПутьКФайлуКласса = ОбъединитьПути(КаталогКлассов, ИмяКлассаФайла + ".os"); + ДанныеФайла = ПолучитBase64Строка(ПолныйПутьКФайлу); + ХешСтрока = ПолучитьХешСтроку(ПолныйПутьКФайлу); + + ЗаписатьКласс(ПутьКФайлуКласса, НайденныйФайл.Имя, "1.0.0", ХешСтрока, ДанныеФайла); + + ИндексКлассов.Вставить(НайденныйФайл.Имя, ИмяКлассаФайла); + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьХешСтроку(ПутьКФайлу) + + ХешФайла = Новый ХешированиеДанных(ХешФункция.MD5); + ХешФайла.ДобавитьФайл(ПутьКФайлу); + + Возврат ХешФайла.ХешСуммаСтрокой; + +КонецФункции + +Процедура ЗаписатьКласс(ПутьКФайлуКласса, ИмяФайла, ВерсияФайла, ХешСтрока, ДанныеФайла) + + ШаблонТекст = " + |/////////////////////////////////////////// + |// ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ // + |/////////////////////////////////////////// + |// + |// ФАЙЛ: <%1> + |// + | + |// Возвращает версию запакованного файла + |// + |Функция Версия() Экспорт + | Возврат ""%2""; + |КонецФункции + | + |// Возвращает имя запакованного файла + |// + |Функция ИмяФайла() Экспорт + | Возврат ""%1""; + |КонецФункции + | + |// Возвращает хеш строку запакованного файла + |// + |Функция Хеш() Экспорт + | Возврат ""%3""; + |КонецФункции + | + |// Возвращает запакованные данные файла + |// + |Функция ДвоичныеДанные() Экспорт + | ЗапакованныеДанные = ""%4""; + | Возврат ЗапакованныеДанные; + |КонецФункции + | + |"; + + ТекстКласса = СтрШаблон(ШаблонТекст, ИмяФайла, ВерсияФайла, ХешСтрока, ДанныеФайла); + + ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлуКласса); + ЗаписьТекста.ЗаписатьСтроку(ТекстКласса); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +Функция ПолучитBase64Строка(ПутьКФайлу) + + ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу); + Строка = Base64Строка(ДвоичныеДанныеФайла); + Возврат Строка; + +КонецФункции + +ВыполнитьЗапаковку(); \ No newline at end of file diff --git a/tasks/test.os b/tasks/test.os index 112510e..d245c72 100644 --- a/tasks/test.os +++ b/tasks/test.os @@ -1,39 +1,86 @@ -#Использовать ".." +#Использовать "../src" #Использовать 1bdd +#Использовать 1testrunner -КаталогПроекта = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); -КаталогОтчета = ОбъединитьПути(КаталогПроекта, "test-reports"); -ПутьОтчетаJUnit = ОбъединитьПути(КаталогОтчета, "junit-bdd.xml"); +Функция ПрогнатьТесты() + + Тестер = Новый Тестер; -ФайлКаталогОтчета = Новый Файл(КаталогОтчета); -Если Не ФайлКаталогОтчета.Существует() Тогда - СоздатьКаталог(КаталогОтчета); -КонецЕсли; + ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); + ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); -КаталогФич = ОбъединитьПути(КаталогПроекта, "features"); -Файл_КаталогФич = Новый Файл(КаталогФич); + КаталогТестов = Новый Файл(ПутьКТестам); + Если Не КаталогТестов.Существует() Тогда + Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам)); + Возврат Истина; + КонецЕсли; -ИсполнительБДД = Новый ИсполнительБДД; -РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); -ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + РезультатТестирования = Тестер.ТестироватьКаталог( + КаталогТестов, + Новый Файл(ПутьКОтчетуJUnit) + ); -СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; -Если РезультатыВыполнения.Строки.Количество() > 0 Тогда + Успешно = РезультатТестирования = 0; - СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + Возврат Успешно; +КонецФункции // ПрогнатьТесты() + +Функция ПрогнатьФичи() -КонецЕсли; + ПутьОтчетаJUnit = "./bdd-log.xml"; -ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; -ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); + КаталогФич = ОбъединитьПути(".", "features"); -Сообщить(СтрШаблон("Результат выполнения bdd-tests: %1", ИтоговыйРезультатВыполнения)); + Файл_КаталогФич = Новый Файл(КаталогФич); + Если Не Файл_КаталогФич.Существует() Тогда + Сообщить(СтрШаблон("Не найден каталог фич %1", КаталогФич)); + Возврат Истина; + КонецЕсли; -Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда - - ВызватьИсключение 1; - -КонецЕсли; + ИсполнительБДД = Новый ИсполнительБДД; + РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); + ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + + СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; + Если РезультатыВыполнения.Строки.Количество() > 0 Тогда + + СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + + КонецЕсли; + + ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; + ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); + + Сообщить(СтрШаблон("Результат прогона фич <%1> + |", ИтоговыйРезультатВыполнения)); + + Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; +КонецФункции // ПрогнатьФичи() + +ТестыПрошли = Истина; + +// Попытка +// ТестыПрошли = ПрогнатьТесты(); + +// Исключение +// ТестыПрошли = Ложь; +// Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно +// |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +// КонецПопытки; +ФичиПрошли = Истина; +Попытка + ФичиПрошли = ПрогнатьФичи(); +Исключение + ФичиПрошли = Ложь; + Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; +Если Не ТестыПрошли Или Не ФичиПрошли Тогда + ВызватьИсключение "Тестирование завершилось неудачно!"; +Иначе + Сообщить(СтрШаблон("Результат прогона тестов <%1> + |", ТестыПрошли)); +КонецЕсли; \ No newline at end of file diff --git a/tests/fixtures/storage/1cv8ddb.1CD b/tests/fixtures/storage/1cv8ddb.1CD index 33d847b..dc49295 100644 Binary files a/tests/fixtures/storage/1cv8ddb.1CD and b/tests/fixtures/storage/1cv8ddb.1CD differ diff --git a/tests/fixtures/storage/cache/ddb00005.snp b/tests/fixtures/storage/cache/ddb00005.snp new file mode 100644 index 0000000..2bbd764 Binary files /dev/null and b/tests/fixtures/storage/cache/ddb00005.snp differ diff --git a/tests/fixtures/storage/ver b/tests/fixtures/storage/ver index 0fab059..6349584 100644 --- a/tests/fixtures/storage/ver +++ b/tests/fixtures/storage/ver @@ -1 +1 @@ -{0,2,8,3,10,2299,"Designer"} \ No newline at end of file +{0,2,8,3,10,2650,"Designer"} \ No newline at end of file diff --git a/travis-ci.sh b/travis-ci.sh new file mode 100644 index 0000000..09ef222 --- /dev/null +++ b/travis-ci.sh @@ -0,0 +1,18 @@ + + +set -e +echo "Устанавливаю версию OScript <$OSCRIPT_VERSION>" +curl http://oscript.io/downloads/$OSCRIPT_VERSION/deb > oscript.deb +dpkg -i oscript.deb +rm -f oscript.deb + +opm install 1testrunner; +opm install 1bdd; +opm install notify; +opm install coverage; + +opm list + +opm run coverage; + +