Skip to content

Commit

Permalink
Реализация прилепляемых коллекций для ОСени
Browse files Browse the repository at this point in the history
  • Loading branch information
sfaqer committed Oct 31, 2023
0 parents commit baaff82
Show file tree
Hide file tree
Showing 20 changed files with 562 additions and 0 deletions.
16 changes: 16 additions & 0 deletions .github/workflows/testing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Тестирование

on:
push:
pull_request:
workflow_dispatch:

jobs:
test:
strategy:
fail-fast: false
matrix:
oscript_version: ['1.8.5', 'stable', 'dev', 'lts-dev']
uses: autumn-library/workflows/.github/workflows/test.yml@main
with:
oscript_version: ${{ matrix.oscript_version }}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
build/
.vscode/
oscript_modules/
25 changes: 25 additions & 0 deletions LICENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
The MIT License (MIT)
=====================

Copyright © `2023` `Kirill Chernenko <faqer2012@gmail.com>`

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.
30 changes: 30 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# autumn-collections

Модуль реализует функциональность прилепляемых коллекций для [ОСени](https://github.com/autumn-library/autumn)

Поставляются прилепляемые коллекции для типов:
* [Массив](https://oscript.io/syntax/page/Массив)
* [Соответствие](https://oscript.io/syntax/page/Соответствие)
* [ТаблицаЗначений](https://oscript.io/syntax/page/ТаблицаЗначений)
* [Список](https://github.com/sfaqer/collectionos)
* [Множество](https://github.com/sfaqer/collectionos)
* [Карта](https://github.com/sfaqer/collectionos)

Так же имеется возможность добавить собственную прилепляемую коллекцию реализовав класс по примеру ниже:

```bsl
Перем Коллекция;
Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Добавить(Желудь);
КонецПроцедуры
Функция Получить() Экспорт
Возврат СтрСоединить(Коллекция, ", ");
КонецФункции
&ПрилепляемаяКоллекция("Строка")
Процедура ПриСозданииОбъекта()
Коллекция = Новый Массив();
КонецПроцедуры
```
15 changes: 15 additions & 0 deletions packagedef
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
Описание.Имя("autumn-collections")
.Версия("0.1.0")
.Автор("Кирилл Черненко")
.АдресАвтора("https://github.com/sfaqer")
.Описание("Модуль прилепляемых коллекций для ОСени")
.ВерсияСреды("1.8.3")
.ВключитьФайл("src")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("coverage")
.РазработкаЗависитОт("fs")
.РазработкаЗависитОт("json")
.РазработкаЗависитОт("asserts")
.ЗависитОт("collectionos", "0.3.1")
.ЗависитОт("annotations", "0.1.0")
;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Перем _ИмяКоллекции;

&Аннотация("ПрилепляемаяКоллекция")
Процедура ПриСозданииОбъекта(Значение)
_ИмяКоллекции = Значение;
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#Использовать collectionos

Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Вставить(ОпределениеЖелудя.Имя(), Желудь);
КонецПроцедуры

Функция Получить() Экспорт
Возврат Новый ФиксированнаяКарта(Коллекция);
КонецФункции

&ПрилепляемаяКоллекция("Карта")
Процедура ПриСозданииОбъекта()
Коллекция = Новый КартаСоответствие();
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Добавить(Желудь);
КонецПроцедуры

Функция Получить() Экспорт
Возврат Новый ФиксированныйМассив(Коллекция);
КонецФункции

&ПрилепляемаяКоллекция("Массив")
Процедура ПриСозданииОбъекта()
Коллекция = Новый Массив();
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#Использовать collectionos

Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Добавить(Желудь);
КонецПроцедуры

Функция Получить() Экспорт
Возврат Новый ФиксированноеМножество(Коллекция);
КонецФункции

&ПрилепляемаяКоллекция("Множество")
Процедура ПриСозданииОбъекта()
Коллекция = Новый МножествоСоответствие();
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Вставить(ОпределениеЖелудя.Имя(), Желудь);
КонецПроцедуры

Функция Получить() Экспорт
Возврат Новый ФиксированноеСоответствие(Коллекция);
КонецФункции

&ПрилепляемаяКоллекция("Соответствие")
Процедура ПриСозданииОбъекта()
Коллекция = Новый Соответствие();
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#Использовать collectionos

Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Добавить(Желудь);
КонецПроцедуры

Функция Получить() Экспорт
Возврат Новый ФиксированныйСписок(Коллекция);
КонецФункции

&ПрилепляемаяКоллекция("Список")
Процедура ПриСозданииОбъекта()
Коллекция = Новый СписокМассив();
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт

Строка = Коллекция.Добавить();

Строка.Имя = ОпределениеЖелудя.Имя();
Строка.Желудь = Желудь;
Строка.ОпределениеЖелудя = ОпределениеЖелудя;

КонецПроцедуры

Функция Получить() Экспорт
Возврат Коллекция.Скопировать();
КонецФункции

&ПрилепляемаяКоллекция("ТаблицаЗначений")
Процедура ПриСозданииОбъекта()

Коллекция = Новый ТаблицаЗначений();

Коллекция.Колонки.Добавить("Имя");
Коллекция.Колонки.Добавить("Желудь");
Коллекция.Колонки.Добавить("ОпределениеЖелудя");

КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#Использовать annotations
#Использовать collectionos
#Использовать reflector

Перем ПрилепляемыеКоллекции;
Перем ИнтерфейсПрилепляемойКоллекции;
Перем Рефлектор;

Процедура ПриСозданииОбъекта()

ПрилепляемыеКоллекции = Новый КартаСоответствие();

ИнтерфейсПрилепляемойКоллекции = Новый ИнтерфейсОбъекта()
.ПроцедураИнтерфейса("Добавить", 2)
.ФункцияИнтерфейса("Получить", 0);

Рефлектор = Новый Рефлектор();

КонецПроцедуры

Процедура ДобавитьПрилепляемуюКоллекцию(Тип) Экспорт

РефлекторОбъекта = Новый РефлекторОбъекта(Тип);

Методы = РефлекторОбъекта.ПолучитьТаблицуМетодов("ПрилепляемаяКоллекция", Ложь);

Аннотация = РаботаСАннотациями.ПолучитьАннотацию(
Методы[0],
"ПрилепляемаяКоллекция"
);

Имя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация);

Если ЕстьПрилепляемаяКоллекция(Имя) Тогда
ВызватьИсключение СтрШаблон("Прилепляемая коллекция %1 уже зарегистрирована", Имя);
КонецЕсли;

РефлекторОбъекта.РеализуетИнтерфейс(
ИнтерфейсПрилепляемойКоллекции,
Истина
);

ПрилепляемыеКоллекции.Вставить(Имя, Тип);

КонецПроцедуры

Функция ПолучитьПрилепляемуюКоллекцию(Имя) Экспорт

Возврат Новый(
ПрилепляемыеКоллекции
.Получить(Имя)
.ИначеВызватьИсключение("Неизвестная прилепляемая коллекция " + Имя)
);

КонецФункции

Функция ЕстьПрилепляемаяКоллекция(Имя) Экспорт
Возврат ПрилепляемыеКоллекции.Получить(Имя).СодержитЗначение();
КонецФункции
34 changes: 34 additions & 0 deletions tasks/coverage.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#Использовать coverage
#Использовать 1commands
#Использовать fs

СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;

ФС.ОбеспечитьПустойКаталог(ОбъединитьПути("build", "coverage"));
ПутьКСтат = "build/coverage/stat.json";

Команда = Новый Команда;
Команда.УстановитьКоманду("oscript");
Если НЕ ЭтоWindows Тогда
Команда.ДобавитьПараметр("-encoding=utf-8");
КонецЕсли;
Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат));
Команда.ДобавитьПараметр("tasks/test.os");
Команда.ПоказыватьВыводНемедленно(Истина);

КодВозврата = Команда.Исполнить();

ФайлСтатистики = Новый Файл(ПутьКСтат);

ПроцессорГенерации = Новый ГенераторОтчетаПокрытия();

ПроцессорГенерации.ОтносительныеПути()
.РабочийКаталог("build/coverage")
.КаталогИсходников(ТекущийКаталог())
.ФайлСтатистики(ФайлСтатистики.ПолноеИмя)
.GenericCoverage()
.Cobertura()
.Сформировать();

ЗавершитьРаботу(КодВозврата);
1 change: 1 addition & 0 deletions tasks/oscript.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib.system=../oscript_modules
45 changes: 45 additions & 0 deletions tasks/test.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#Использовать 1testrunner
#Использовать fs

Функция ПрогнатьТесты()

Тестер = Новый Тестер;
Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec);
Тестер.ПодробныеОписанияОшибок(Истина);

ПутьКТестам = "tests";
ПутьКОтчетуJUnit = ОбъединитьПути("build", "testsResults");

ФС.ОбеспечитьПустойКаталог(ПутьКОтчетуJUnit);

РезультатТестирования = Тестер.ТестироватьКаталог(
Новый Файл(ПутьКТестам),
Новый Файл(ПутьКОтчетуJUnit)
);

Успешно = РезультатТестирования = 0;

Возврат Успешно;

КонецФункции // ПрогнатьТесты()

// основной код

ТекКаталог = ТекущийКаталог();

Попытка
ТестыПрошли = ПрогнатьТесты();
Исключение
ТестыПрошли = Ложь;
Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно
|%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецПопытки;

УстановитьТекущийКаталог(ТекКаталог);

Если Не ТестыПрошли Тогда
ВызватьИсключение "Тестирование завершилось неудачно!";
Иначе
Сообщить(СтрШаблон("Результат прогона тестов <%1>
|", ТестыПрошли));
КонецЕсли;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Процедура Добавить(Желудь) Экспорт
КонецПроцедуры

&ПрилепляемаяКоллекция("Сломанная")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Перем Коллекция;

Процедура Добавить(Желудь, ОпределениеЖелудя) Экспорт
Коллекция.Добавить(Желудь);
КонецПроцедуры

Функция Получить() Экспорт
Возврат СтрСоединить(Коллекция, ", ");
КонецФункции

&ПрилепляемаяКоллекция("Строка")
Процедура ПриСозданииОбъекта()
Коллекция = Новый Массив();
КонецПроцедуры
3 changes: 3 additions & 0 deletions tests/Классы/ТестОпределение.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Функция Имя() Экспорт
Возврат "Тест";
КонецФункции
Loading

0 comments on commit baaff82

Please sign in to comment.