Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
Nivanchenko committed Mar 22, 2023
0 parents commit 39eeb8d
Show file tree
Hide file tree
Showing 13 changed files with 509 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.vscode
.DS_Store
*.ospx
out/
oscript_modules/
77 changes: 77 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@

# autumn-annotation-types - набор аннотаций ОСени, для удобной инициализации стандартных типов.

## Что это и зачем ?

Очень часто приходится писать вот такой код:

```bsl
Перем МойМассив;
&Желудь
Процедура ПриСозданииОбъекта()
МойМассив = Новый Массив;
КонецПроцедуры
```

Мы обозначаем переменные(поля класса), и где-то из конструктора инициализируем значения. Данная библиотека содержит набор аннотаций, которые помогают сократить написание количество кода, и его читаемость. Благодаря этим аннотациям ОСень берет на себя всю работу по инициализации полей.

```bsl
&Массив
Перем МойМассив;
&Желудь
Процедура ПриСозданииОбъекта()
КонецПроцедуры
```

## Поддерживаемые типы

```&Массив(Размер)``` - В поле внедряется новый массив. Параметр ```Размер``` необязательный, позволяет задать размер массива.

```&Соответствие``` - В поле внедряется новое соответствие.

```&Структура(Ключи)``` - В поле внедряется новая структура. Параметр ```Ключи``` необязательный. Строка, содержащая список ключей структуры, разделенные запятой "```,```"

```&ТаблицаЗначений(Колонки)``` - В поле внедряется новая таблица значений. Параметр ```Колонки``` необязательный. Строка, содержащая список имен колонок, разделенных запятой "```,```"

## Подключение и использование

В точке входа вашего приложения подключить библиотеку

```bsl
#Использовать autumn
#Использовать autumn-annotation-types
Поделка = Новый Поделка();
. . .
```

Пример внедрения типов в поля желудя:

```bsl
&Массив
Перем ПустойМассив Экспорт;
&ТаблицаЗначений("Колонка1, Колонка2")
Перем ТЗ Экспорт;
&ТаблицаЗначений
Перем ТЗБезКолонок Экспорт;
&Соответствие
Перем Соответствие Экспорт;
&Структура("Ключ1, Ключ2")
Перем СтруктураСКлючами Экспорт;
&Структура
Перем ПустаяСтруктура Экспорт;
Перем МассивСРазмером1 Экспорт;
&Желудь
Процедура ПриСозданииОбъекта(&Массив(1) _Массив)
МассивСРазмером1 = _Массив;
КонецПроцедуры
```
108 changes: 108 additions & 0 deletions package-loader.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// Пояснения по переменным даны в конце модуля
Перем ПоказатьСообщенияЗагрузки;
Перем ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей;

Перем КэшМодулей;

Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)
Вывести("
|ПриЗагрузкеБиблиотеки " + Путь);

Если Осень <> Неопределено Тогда
ПутьДоЗаготовки = ОбъединитьПути(Путь, "src/Заготовки/ИнициализацияАннотацийТипов.os");
ПодключитьСценарий(ПутьДоЗаготовки, "ИнициализацияАннотацийТипов");
Осень.ДобавитьЗаготовкуДляАвтоИнициализации("ИнициализацияАннотацийТипов");

мКаталог = ОбъединитьПути(Путь, "src/Классы");
ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ);
Иначе
ВызватьИсключение "Некорректный порядок импорта библиотек. Сначала подключите autumn";
КонецЕсли;

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

Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ)

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

Если КаталогКлассов.Существует() Тогда
Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os");
Для Каждого Файл Из Файлы Цикл
Вывести(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя));
СтандартнаяОбработка = Ложь;
// ДобавитьКласс(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения);
КонецЦикла;
КонецЕсли;

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

Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса)
Вывести("Добавляю класс, если ранее не добавляли " + ИмяКласса);
Если ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей Тогда
Вывести("Добавляю класс " + ИмяКласса);
ДобавитьКласс(ПутьФайла, ИмяКласса);
Возврат;
КонецЕсли;

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

Вывести("Добавляю класс, т.к. он не найден - " + ИмяКласса);
ДобавитьКласс(ПутьФайла, ИмяКласса);

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

КонецЕсли;
КонецПроцедуры

Процедура Вывести(Знач Сообщение)
Если ПоказатьСообщенияЗагрузки Тогда
Сообщить(Сообщение);
КонецЕсли;
КонецПроцедуры

Функция ПолучитьБулевоИзПеременнойСреды(Знач ИмяПеременнойСреды, Знач ЗначениеПоУмолчанию)
Рез = ЗначениеПоУмолчанию;
РезИзСреды = ПолучитьПеременнуюСреды(ИмяПеременнойСреды);
Если ЗначениеЗаполнено(РезИзСреды) Тогда
РезИзСреды = СокрЛП(РезИзСреды);
Попытка
Рез = Число(РезИзСреды) <> 0 ;
Исключение
Рез = ЗначениеПоУмолчанию;
Сообщить(СтрШаблон("Неверный формат переменной среды %1. Ожидали 1 или 0, а получили %2", ИмяПеременнойСреды, РезИзСреды));
КонецПопытки;
КонецЕсли;

Возврат Рез;
КонецФункции

// Если Истина, то выдаются подробные сообщения о порядке загрузке пакетов, классов, модулей, что помогает при анализе проблем
// очень полезно при анализе ошибок загрузки
// Переменная среды может принимать значение 0 (выключено) или 1 (включено)
// Значение флага по умолчанию - Ложь
ПоказатьСообщенияЗагрузки = ПолучитьБулевоИзПеременнойСреды(
"OSLIB_LOADER_TRACE", Ложь);

// Если Ложь, то пропускаются ошибки повторной загрузки классов/модулей,
//что важно при разработке/тестировании стандартных библиотек
// Если Истина, то выдается ошибка при повторной загрузке классов библиотек из движка
// Переменная среды может принимать значение 0 (выключено) или 1 (включено)
// Значение флага по умолчанию - Истина
ВыдаватьОшибкуПриЗагрузкеУжеСуществующихКлассовМодулей = ПолучитьБулевоИзПеременнойСреды(
"OSLIB_LOADER_DUPLICATES", Ложь);

// для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку
// (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os)

КэшМодулей = Новый Массив;
17 changes: 17 additions & 0 deletions packagedef
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
////////////////////////////////////////////////////////////
// Описание пакета для сборки и установки
// Полную документацию см. на hub.oscript.io/packaging
//


Описание.Имя("autumn-annotation-types")
.Версия("1.0.0")
.Автор("nikita ivanchenko")
.АдресАвтора("https://github.com/Nivanchenko")
.Описание("Набор аннотаций ОСени, для удобной инициализации стандартных типов")
.ВерсияСреды("1.8.3")
.ВключитьФайл("src")
.ВключитьФайл("package-loader.os")
.ЗависитОт("autumn", "3.1.1")
;

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

Процедура ПриИнициализацииПоделки(Поделка) Экспорт

КаталогМодуля = ОбъединитьПути(ТекущийСценарий().Каталог, "../Классы");
Поделка.ПросканироватьКаталог(КаталогМодуля);

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

&Заготовка
Процедура ПриСозданииОбъекта()
КонецПроцедуры
14 changes: 14 additions & 0 deletions src/Классы/АннотацияТипМассив.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Перем Размер;

Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт

Аннотация = РаботаСАннотациями.НайтиАннотацию(ПодчиненныеАннотации, "Пластилин");
Аннотация.Параметры[1].Значение = Размер;

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

&Аннотация("Массив")
&Пластилин(Значение = "Массив", Блестяшка = 0)
Процедура ПриСозданииОбъекта(Значение = 0)
Размер = Значение;
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт

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

&Аннотация("Соответствие")
&Пластилин(Значение = "Соответствие")
Процедура ПриСозданииОбъекта(Значение = "")

КонецПроцедуры
14 changes: 14 additions & 0 deletions src/Классы/АннотацияТипСтруктура.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Перем Ключи;

Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт

Аннотация = РаботаСАннотациями.НайтиАннотацию(ПодчиненныеАннотации, "Пластилин");
Аннотация.Параметры[1].Значение = Ключи;

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

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

Процедура ПриРазворачиванииАннотации(ОпределениеАннотации, ПодчиненныеАннотации, ТипВладельцаСвойств, Свойство) Экспорт

Аннотация = РаботаСАннотациями.НайтиАннотацию(ПодчиненныеАннотации, "Пластилин");
Аннотация.Параметры[1].Значение = Колонки;

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

&Аннотация("ТаблицаЗначений")
&Пластилин(Значение = "ТаблицаЗначений", Блестяшка = "")
Процедура ПриСозданииОбъекта(Значение = "")
Колонки = Значение;
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

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

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

&Завязь
&Характер("Компанейский")
Функция Массив(&Блестяшка Размер) Экспорт
Если Размер > 0 Тогда
Массив = Новый Массив(Размер);
Иначе
Массив = Новый Массив();
КонецЕсли;

Возврат Массив;
КонецФункции

&Завязь
&Характер("Компанейский")
Функция Структура(&Блестяшка Ключи) Экспорт
Возврат Новый Структура(Ключи);
КонецФункции

&Завязь
&Характер("Компанейский")
Функция Соответствие() Экспорт
Возврат Новый Соответствие();
КонецФункции

&Завязь
&Характер("Компанейский")
Функция ТаблицаЗначений(&Блестяшка Колонки) Экспорт
ТаблицаЗначений = Новый ТаблицаЗначений();

Если НЕ ПустаяСтрока(Колонки) Тогда
Для каждого ИмяКолонки Из СтрРазделить(Колонки, ",") Цикл
ТаблицаЗначений.Колонки.Добавить(СокрЛП(ИмяКолонки));
КонецЦикла;
КонецЕсли;

Возврат ТаблицаЗначений;
КонецФункции
Loading

0 comments on commit 39eeb8d

Please sign in to comment.