diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5fc4cf4..ac7c051 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,10 +14,10 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - oscript_version: ['1.2.0', 'dev', 'stable'] + oscript_version: ['1.8.3', 'stable'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup Onescript Action uses: otymko/setup-onescript@v1.1 diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 4ffce84..f75d729 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: # Disabling shallow clone is recommended for improving relevancy of reporting fetch-depth: 0 @@ -17,7 +17,7 @@ jobs: - name: Setup Onescript Action uses: otymko/setup-onescript@v1.1 with: - version: dev + version: "1.8.3" - name: Install dependencies run: | @@ -48,7 +48,7 @@ jobs: - name: SonarCloud Scan on push if: github.repository == 'nixel2007/entity' && github.event_name == 'push' - uses: nixel2007/sonarcloud-github-action@v1.4 + uses: nixel2007/sonarcloud-github-action@v1.5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -60,7 +60,7 @@ jobs: - name: SonarCloud Scan on PR if: github.repository == 'nixel2007/entity' && github.event_name == 'pull_request' - uses: nixel2007/sonarcloud-github-action@v1.4 + uses: nixel2007/sonarcloud-github-action@v1.5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d19f4c3 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,57 @@ +# MIT License +# Copyright (C) 2020 Tymko Oleg and contributors +# All rights reserved. + +name: Подготовка релиза и публикация в хабе +# Только события создания и изменения релиза +on: + release: + types: [published, edited] + +env: + PACKAGE_MASK: entity-*.ospx + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + oscript_version: ['1.8.3'] + + steps: + # Загрузка проекта + - name: Актуализация + uses: actions/checkout@v2 + + # Установка OneScript конкретной версии + - name: Установка OneScript + uses: otymko/setup-onescript@v1.1 + with: + version: ${{ matrix.oscript_version }} + + # Установка зависимостей пакета + - name: Установка зависимостей + run: | + opm install opm + opm install + + - name: Сборка пакета + run: opm build . + + - name: Заливка артефактов + uses: actions/upload-artifact@v2 + with: + name: package.zip + path: ./${{ env.PACKAGE_MASK }} + + #- name: Заливка в релиз + # uses: AButler/upload-release-assets@v2.0.2 + # with: + # files: ./${{ env.PACKAGE_MASK }} + # repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Публикация в hub.oscript.io + shell: bash + run: opm push -f ./${{ env.PACKAGE_MASK }} --token ${{ secrets.PUSH_TOKEN }} -c stable diff --git a/.gitignore b/.gitignore index 841541b..dc8151a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ tests-reports/ .sonar/ .idea/ out/ +tests/jsondatabase oscript_modules/ diff --git a/packagedef b/packagedef index 5a34919..f14ecb3 100644 --- a/packagedef +++ b/packagedef @@ -4,11 +4,11 @@ // // BSLLS:CodeOutOfRegion-off Описание.Имя("entity") - .Версия("2.3.3.1") + .Версия("2.3.4.0") .Автор("Nikita Gryzlov") .АдресАвтора("nixel2007@gmail.com") .Описание("entity") - .ВерсияСреды("1.2.0") + .ВерсияСреды("1.8.3") .ВключитьФайл("src") .ВключитьФайл("tests") .ВключитьФайл("lib.config") @@ -20,9 +20,9 @@ .ЗависитОт("fs", "1.0.0") .ЗависитОт("logos", "1.2.1") .ЗависитОт("json", "1.1.1") - .ЗависитОт("decorator", "1.2.0") + .ЗависитОт("decorator", "1.5.1") .ЗависитОт("reflector", "0.6.1") - .ЗависитОт("semaphore", "1.0.1") + .ЗависитОт("semaphore", "1.1.0") .ЗависитОт("sql", "1.1.1.2") .ЗависитОт("strings", "0.5.0") .РазработкаЗависитОт("1bdd") diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\272\321\202\320\270\320\262\320\275\320\260\321\217\320\227\320\260\320\277\320\270\321\201\321\214.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\272\321\202\320\270\320\262\320\275\320\260\321\217\320\227\320\260\320\277\320\270\321\201\321\214.os" index 268009d..7032f54 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\272\321\202\320\270\320\262\320\275\320\260\321\217\320\227\320\260\320\277\320\270\321\201\321\214.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\272\321\202\320\270\320\262\320\275\320\260\321\217\320\227\320\260\320\277\320\270\321\201\321\214.os" @@ -11,53 +11,65 @@ Функция СоздатьИзМенеджера(ОбъектМодели, МенеджерСущностей) Экспорт Сущность = Новый(ОбъектМодели.ТипСущности()); - - Декоратор = Новый КонструкторДекоратора(Сущность) - .ДобавитьИмпортПоИмени("decorator") - .ДобавитьПриватноеПоле("_МенеджерСущностей", МенеджерСущностей) - .ДобавитьПриватноеПоле("_ОбъектМодели", ОбъектМодели) - .ДобавитьМетод( - "Прочитать", - "_ТипСущности = ОбработкаДекоратора.ИсходныйТип(ЭтотОбъект); - |_ДанныеСущности = _МенеджерСущностей.ПолучитьОдно( - | _ТипСущности, - | _ОбъектМодели.ПолучитьЗначениеИдентификатора(ЭтотОбъект) - |); - |ОбработкаДекоратора.СинхронизироватьПоля(_ДанныеСущности, ЭтотОбъект);" - ) - .ДобавитьМетод( - "Сохранить", - "_МенеджерСущностей.Сохранить(ЭтотОбъект);" - ) - .ДобавитьМетод( - "Удалить", - "_МенеджерСущностей.Удалить(ЭтотОбъект);" - ) - .Построить(); - + + Декоратор = Новый ПостроительДекоратора(Сущность) + .Импорт(Новый Импорт("decorator")) + + .Поле(Новый Поле("_МенеджерСущностей") + .ЗначениеПоУмолчанию(МенеджерСущностей)) + + .Поле(Новый Поле("_ОбъектМодели") + .ЗначениеПоУмолчанию(ОбъектМодели)) + + .Метод(Новый Метод("Прочитать") + .Публичный() + .ТелоМетода("_ТипСущности = ОбработкаДекоратора.ИсходныйТип(ЭтотОбъект); + |_ДанныеСущности = _МенеджерСущностей.ПолучитьОдно( + | _ТипСущности, + | _ОбъектМодели.ПолучитьЗначениеИдентификатора(ЭтотОбъект) + |); + |ОбработкаДекоратора.СинхронизироватьПоля(_ДанныеСущности, ЭтотОбъект);")) + + + .Метод(Новый Метод("Сохранить") + .Публичный() + .ТелоМетода("_МенеджерСущностей.Сохранить(ЭтотОбъект);")) + + .Метод(Новый Метод("Удалить") + .Публичный() + .ТелоМетода("_МенеджерСущностей.Удалить(ЭтотОбъект);")) + + .Построить(); + Возврат Декоратор; КонецФункции Функция СоздатьИзХранилища(ОбъектМодели, ХранилищеСущностей) Экспорт Сущность = Новый(ОбъектМодели.ТипСущности()); - - Декоратор = Новый КонструкторДекоратора(Сущность) - .ДобавитьИмпортПоИмени("decorator") - .ДобавитьПриватноеПоле("_ХранилищеСущностей", ХранилищеСущностей) - .ДобавитьПриватноеПоле("_ОбъектМодели", ОбъектМодели) - .ДобавитьМетод( - "Прочитать", - "_ДанныеСущности = _ХранилищеСущностей.ПолучитьОдно(_ОбъектМодели.ПолучитьЗначениеИдентификатора(ЭтотОбъект)); - |ОбработкаДекоратора.СинхронизироватьПоля(_ДанныеСущности, ЭтотОбъект);" - ) - .ДобавитьМетод( - "Сохранить", - "_ХранилищеСущностей.Сохранить(ЭтотОбъект);" - ) - .ДобавитьМетод( - "Удалить", - "_ХранилищеСущностей.Удалить(ЭтотОбъект);" - ) + + Декоратор = Новый ПостроительДекоратора(Сущность) + .Импорт(Новый Импорт("decorator")) + + .Поле(Новый Поле("_ХранилищеСущностей") + .ЗначениеПоУмолчанию(ХранилищеСущностей)) + + .Поле(Новый Поле("_ОбъектМодели") + .ЗначениеПоУмолчанию(ОбъектМодели)) + + .Метод(Новый Метод("Прочитать") + .Публичный() + .ТелоМетода("_ДанныеСущности = _ХранилищеСущностей.ПолучитьОдно(_ОбъектМодели.ПолучитьЗначениеИдентификатора(ЭтотОбъект)); + |ОбработкаДекоратора.СинхронизироватьПоля(_ДанныеСущности, ЭтотОбъект);")) + + + .Метод(Новый Метод("Сохранить") + .Публичный() + .ТелоМетода("_ХранилищеСущностей.Сохранить(ЭтотОбъект);")) + + .Метод(Новый Метод("Удалить") + .Публичный() + .ТелоМетода("_ХранилищеСущностей.Удалить(ЭтотОбъект);")) + .Построить(); Возврат Декоратор; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" index a8c82e7..13a9623 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200PostgreSQL.os" @@ -191,7 +191,7 @@ Семафор = Семафоры.Получить(Строка(ОбъектМодели.ТипСущности())); Семафор.Захватить(); Запрос.Текст = ТекстЗапроса; - Сообщить(ТекстЗапроса); + Запрос.ВыполнитьКоманду(); Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда diff --git "a/tests/fixtures/\320\237\321\200\320\276\321\201\321\202\320\276\320\271\320\236\320\261\321\212\320\265\320\272\321\202.os" "b/tests/fixtures/\320\237\321\200\320\276\321\201\321\202\320\276\320\271\320\236\320\261\321\212\320\265\320\272\321\202.os" new file mode 100644 index 0000000..6d163d4 --- /dev/null +++ "b/tests/fixtures/\320\237\321\200\320\276\321\201\321\202\320\276\320\271\320\236\320\261\321\212\320\265\320\272\321\202.os" @@ -0,0 +1,10 @@ + +&Идентификатор +Перем Идентификатор Экспорт; + +Перем Поле Экспорт; + +&Сущность(ИмяТаблицы = "ПростыеОбъекты") +Процедура ПриСозданииОбъекта() + +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" index 6430e2e..f118736 100644 --- "a/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" +++ "b/tests/\320\232\320\276\320\275\320\275\320\265\320\272\321\202\320\276\321\200JSON.os" @@ -1,3 +1,4 @@ +#Использовать fs #Использовать ".." Перем Коннектор; @@ -126,3 +127,114 @@ Ожидаем.Что(Сущность.Идентификатор).Равно(2); КонецПроцедуры + +&Тест +Процедура СущностьМожетЗаписатьСебя() Экспорт + // Дано + ПодключитьСценарий("tests/fixtures/ПростойОбъект.os", "ПростойОбъект"); + КаталогБД = "./tests/jsondatabase"; + ФС.ОбеспечитьПустойКаталог(КаталогБД); + ТипКоннектора = "КоннекторJSON"; + МенеджерСущностей = Новый МенеджерСущностей(Тип(ТипКоннектора), КаталогБД); + МенеджерСущностей.ДобавитьКлассВМодель(Тип("ПростойОбъект")); + МенеджерСущностей.Инициализировать(); + + // Когда + ПростойОбъект = МенеджерСущностей.СоздатьЭлемент(Тип("ПростойОбъект")); + ПростойОбъект.Идентификатор = "1"; + ПростойОбъект.Поле = "2"; + ПростойОбъект.Сохранить(); + + // Тогда + НайденныйПростойОбъект = МенеджерСущностей.ПолучитьОдно(Тип("ПростойОбъект"), "1"); + + Ожидаем.Что(НайденныйПростойОбъект).Не_().Равно(Неопределено); + Ожидаем.Что(НайденныйПростойОбъект.Идентификатор).Равно("1"); + Ожидаем.Что(НайденныйПростойОбъект.Поле).Равно("2"); + +КонецПроцедуры + +&Тест +Процедура СущностьМожетПерезаписатьСебя() Экспорт + // Дано + ПодключитьСценарий("tests/fixtures/ПростойОбъект.os", "ПростойОбъект"); + КаталогБД = "./tests/jsondatabase"; + ФС.ОбеспечитьПустойКаталог(КаталогБД); + ТипКоннектора = "КоннекторJSON"; + МенеджерСущностей = Новый МенеджерСущностей(Тип(ТипКоннектора), КаталогБД); + МенеджерСущностей.ДобавитьКлассВМодель(Тип("ПростойОбъект")); + МенеджерСущностей.Инициализировать(); + + // Когда + ПростойОбъект = МенеджерСущностей.СоздатьЭлемент(Тип("ПростойОбъект")); + ПростойОбъект.Идентификатор = "1"; + ПростойОбъект.Поле = "2"; + ПростойОбъект.Сохранить(); + НайденныйПростойОбъект = МенеджерСущностей.ПолучитьОдно(Тип("ПростойОбъект"), "1"); + НайденныйПростойОбъект.Поле = "3"; + НайденныйПростойОбъект.Сохранить(); + + // Тогда + НайденныйПростойОбъект = МенеджерСущностей.ПолучитьОдно(Тип("ПростойОбъект"), "1"); + + Ожидаем.Что(НайденныйПростойОбъект).Не_().Равно(Неопределено); + Ожидаем.Что(НайденныйПростойОбъект.Идентификатор).Равно("1"); + Ожидаем.Что(НайденныйПростойОбъект.Поле).Равно("3"); + +КонецПроцедуры + +&Тест +Процедура МенеджерСущностейМожетЗаписать() Экспорт + // Дано + ПодключитьСценарий("tests/fixtures/ПростойОбъект.os", "ПростойОбъект"); + КаталогБД = "./tests/jsondatabase"; + ФС.ОбеспечитьПустойКаталог(КаталогБД); + ТипКоннектора = "КоннекторJSON"; + МенеджерСущностей = Новый МенеджерСущностей(Тип(ТипКоннектора), КаталогБД); + МенеджерСущностей.ДобавитьКлассВМодель(Тип("ПростойОбъект")); + МенеджерСущностей.Инициализировать(); + + // Когда + ПростойОбъект = МенеджерСущностей.СоздатьЭлемент(Тип("ПростойОбъект")); + ПростойОбъект.Идентификатор = "1"; + ПростойОбъект.Поле = "2"; + МенеджерСущностей.Сохранить(ПростойОбъект); + + // Тогда + НайденныйПростойОбъект = МенеджерСущностей.ПолучитьОдно(Тип("ПростойОбъект"), "1"); + + Ожидаем.Что(НайденныйПростойОбъект).Не_().Равно(Неопределено); + Ожидаем.Что(НайденныйПростойОбъект.Идентификатор).Равно("1"); + Ожидаем.Что(НайденныйПростойОбъект.Поле).Равно("2"); + +КонецПроцедуры + +&Тест +Процедура ХранилищеСущностейМожетЗаписать() Экспорт + + // Дано + ПодключитьСценарий("tests/fixtures/ПростойОбъект.os", "ПростойОбъект"); + КаталогБД = "./tests/jsondatabase"; + ФС.ОбеспечитьПустойКаталог(КаталогБД); + ТипКоннектора = "КоннекторJSON"; + МенеджерСущностей = Новый МенеджерСущностей(Тип(ТипКоннектора), КаталогБД); + МенеджерСущностей.ДобавитьКлассВМодель(Тип("ПростойОбъект")); + МенеджерСущностей.Инициализировать(); + + // Когда + + ХранилищеПростойОбъект = МенеджерСущностей.ПолучитьХранилищеСущностей(Тип("ПростойОбъект")); + + ПростойОбъект = ХранилищеПростойОбъект.СоздатьЭлемент(); + ПростойОбъект.Идентификатор = "1"; + ПростойОбъект.Поле = "2"; + ПростойОбъект.Сохранить(); + + // Тогда + НайденныйПростойОбъект = ХранилищеПростойОбъект.ПолучитьОдно("1"); + + Ожидаем.Что(НайденныйПростойОбъект).Не_().Равно(Неопределено); + Ожидаем.Что(НайденныйПростойОбъект.Идентификатор).Равно("1"); + Ожидаем.Что(НайденныйПростойОбъект.Поле).Равно("2"); + +КонецПроцедуры \ No newline at end of file