Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
4a96c9e
Добавлен ОписательДТО, аннотации Синоним и ЗначениеПоУмолчанию, тесты
Segate-ekb Apr 10, 2026
dd9f832
тесты
Segate-ekb Apr 10, 2026
4cf1f04
Вложенные ДТО
Segate-ekb Apr 10, 2026
4a6d087
Вложенные схемы
Segate-ekb Apr 10, 2026
1b258be
фиксы по комментам
Segate-ekb Apr 13, 2026
e74efa2
bump annotations version
Segate-ekb Apr 13, 2026
173e303
Добавлен каст типов
Segate-ekb Apr 13, 2026
d6d549b
переписал хранение реестра классов
Segate-ekb Apr 13, 2026
7006b6f
Убрал определение аннотации и получаю просто по имени
Segate-ekb Apr 13, 2026
230c2b2
fix
Segate-ekb Apr 13, 2026
6e867f6
Инициализация вложенных дто
Segate-ekb Apr 13, 2026
0957c33
фикс после ребейза
Segate-ekb Jun 8, 2026
5a071ac
бамп версии
Segate-ekb Jul 9, 2026
0014066
фикс теста для 2.1
Segate-ekb Jul 9, 2026
39ad7de
Заменены длинные тире на дефисы в комментариях
nixel2007 Jul 21, 2026
4c7c849
Булево приводится по явному списку допустимых значений
nixel2007 Jul 21, 2026
5f7a26d
Рефлектор создаётся один раз на описание класса
nixel2007 Jul 21, 2026
40593ef
Имя класса вложенного DTO читается через объект аннотации
nixel2007 Jul 21, 2026
a5f319d
Заполнение вложенных и верхнеуровневых DTO сведено в одну рекурсию
nixel2007 Jul 21, 2026
830f5ac
Вложенный объект берётся у владельца в момент заполнения
nixel2007 Jul 21, 2026
cb5ff08
Вложенный DTO обязателен к инициализации в родительском DTO
nixel2007 Jul 21, 2026
c404536
Добавлены тесты приведения к типу Дата
nixel2007 Jul 21, 2026
68cdc2d
Удалены дублирующиеся тесты
nixel2007 Jul 21, 2026
116b19f
Из комментариев убраны неверные и внешние сведения
nixel2007 Jul 21, 2026
7fcf16f
Регистрация второго класса на занятый префикс падает с исключением.
Segate-ekb Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,30 @@
//

Описание.Имя("configor")
.Версия("0.12.0")
.Версия("0.13.0")
.Автор("Khorev Aleksey")
.АдресАвтора("Khorevaa@gmail.com")
.Описание("Библиотека для работы с конфигурационными файлами в формате json, yaml")
.ВерсияСреды("2.0.0")
.ВключитьФайл("src")
.ВключитьФайл("docs")
.ЗависитОт("logos")
.ЗависитОт("oscript-yaml")
.ЗависитОт("oscript-yaml", "0.3.0")
.ЗависитОт("asserts")
.ЗависитОт("fluent", "0.6.0")
.ЗависитОт("notify", "0.2.0")
.ЗависитОт("tempfiles")
.ЗависитОт("1connector", "2.3.3")
.ЗависитОт("reflector", "0.3.1")
.ЗависитОт("annotations", "1.3.0")
.РазработкаЗависитОт("coverage", "0.6.1")
.РазработкаЗависитОт("1testrunner", "1.9.2")
.РазработкаЗависитОт("1bdd", "1.14.0")
.РазработкаЗависитОт("1commands", "1.5.0")
.РазработкаЗависитОт("winow", "0.11.0")
.ОпределяетКласс("МенеджерПараметров", "src/Классы/МенеджерПараметров.os")
.ОпределяетКласс("КонструкторПараметров", "src/Классы/КонструкторПараметров.os")
.ОпределяетКласс("АннотацияЗначениеПоУмолчанию", "src/Классы/АннотацияЗначениеПоУмолчанию.os")
.ОпределяетКласс("АннотацияСиноним", "src/Классы/АннотацияСиноним.os")
.ОпределяетКласс("АннотацияВложенныйДТО", "src/Классы/АннотацияВложенныйДТО.os")
;
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// Описание одного поля DTO-класса, полученное из аннотаций свойства

Перем Имя Экспорт; // Строка - имя свойства класса
Перем Тип Экспорт; // Тип - целевой тип значения из аннотации Тип
Перем ЗначениеПоУмолчанию Экспорт; // Произвольный - значение по умолчанию
Перем Синоним Экспорт; // Строка - альтернативное имя ключа в конфигурации
Перем Обязательное Экспорт; // Булево - признак обязательности (нет ЗначениеПоУмолчанию)
Перем ОписанияВложенныхПолей Экспорт; // Массив из ОписаниеПоляДТО - описания полей вложенного DTO

// Конструктор описания поля
//
// Параметры:
// ИмяПоля - Строка - имя свойства класса
//
Процедура ПриСозданииОбъекта(Знач ИмяПоля)

Имя = ИмяПоля;
Тип = Неопределено;
ЗначениеПоУмолчанию = Неопределено;
Синоним = Неопределено;
Обязательное = Истина;
ОписанияВложенныхПолей = Неопределено;

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

// Устанавливает значение по умолчанию, делая поле необязательным
//
// Параметры:
// Значение - Произвольный - значение по умолчанию
//
Процедура УстановитьЗначениеПоУмолчанию(Знач Значение) Экспорт

ЗначениеПоУмолчанию = Значение;
Обязательное = Ложь;

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

// Устанавливает тип значения явно (из аннотации &Тип)
//
// Параметры:
// НовыйТип - Тип - целевой тип значения
//
Процедура УстановитьТип(Знач НовыйТип) Экспорт
Тип = НовыйТип;
КонецПроцедуры

// Устанавливает синоним поля
//
// Параметры:
// НовыйСиноним - Строка - альтернативное имя ключа в конфигурации
//
Процедура УстановитьСиноним(Знач НовыйСиноним) Экспорт
Синоним = НовыйСиноним;
КонецПроцедуры

// Помечает поле как вложенный DTO и сохраняет описания его полей
//
// Параметры:
// ОписанияПолей - Массив из ОписаниеПоляДТО - описания полей вложенного DTO
//
Процедура УстановитьВложенныйДТО(Знач ОписанияПолей) Экспорт
ОписанияВложенныхПолей = ОписанияПолей;
КонецПроцедуры

// Возвращает признак того, что поле является вложенным DTO
//
// Возвращаемое значение:
// Булево - Истина, если поле описано как вложенный DTO
//
Функция ЭтоВложенныйДТО() Экспорт
Возврат Не ОписанияВложенныхПолей = Неопределено;
КонецФункции

// Возвращает ключ для поиска в конфигурации
// Если задан синоним - возвращает его, иначе - имя свойства
//
// Возвращаемое значение:
// Строка - ключ для поиска в конфигурации
//
Функция КлючКонфигурации() Экспорт

Если Не Синоним = Неопределено Тогда
Возврат Синоним;
КонецЕсли;

Возврат Имя;

КонецФункции
96 changes: 96 additions & 0 deletions src/Классы/internal/Классы/ОписательДТО.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#Использовать annotations
#Использовать reflector

Перем КонтейнерАннотаций; // КонтейнерАннотаций - определения поддерживаемых аннотаций

// Описывает класс DTO: читает аннотации экспортных свойств и возвращает массив описаний полей
//
// Параметры:
// КлассОбъект - Объект - экземпляр DTO-класса с аннотированными свойствами
//
// Возвращаемое значение:
// Массив из ОписаниеПоляДТО - массив описаний полей DTO
//
Функция ОписатьКласс(Знач КлассОбъект) Экспорт

РефлекторОбъекта = Новый РефлекторОбъекта(КлассОбъект);
Свойства = РефлекторОбъекта.ПолучитьТаблицуСвойств(Неопределено, Истина);

СтандартныйРефлектор = Новый Рефлектор;

ОписанияПолей = Новый Массив;

Для Каждого Свойство Из Свойства Цикл

Если Не Свойство.Экспорт Тогда
Продолжить;
КонецЕсли;

ОписаниеПоля = Новый ОписаниеПоляДТО(Свойство.Имя);

Для Каждого Аннотация Из Свойство.Аннотации Цикл

ИмяАннотации = Врег(Аннотация.Имя);

Если ИмяАннотации = "ТИП" Тогда
ЗначениеТипа = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация);
ОписаниеПоля.УстановитьТип(Тип(ЗначениеТипа));
Продолжить;
КонецЕсли;

ОпределениеАннотации = КонтейнерАннотаций.ПолучитьОпределениеАннотации(Аннотация.Имя);

Если ОпределениеАннотации = Неопределено Тогда
Продолжить;
КонецЕсли;

ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация);

Если ИмяАннотации = "ЗНАЧЕНИЕПОУМОЛЧАНИЮ" Тогда

ОписаниеПоля.УстановитьЗначениеПоУмолчанию(ОбъектАннотации.Значение());

ИначеЕсли ИмяАннотации = "СИНОНИМ" Тогда

ОписаниеПоля.УстановитьСиноним(ОбъектАннотации.Синоним());

ИначеЕсли ИмяАннотации = "ВЛОЖЕННЫЙДТО" Тогда

ВложенныйОбъект = СтандартныйРефлектор.ПолучитьСвойство(КлассОбъект, Свойство.Имя);

Если ВложенныйОбъект = Неопределено Тогда

ИмяКлассаДТО = ОбъектАннотации.ИмяКлассаДТО();

Если ИмяКлассаДТО = "" Тогда
ВызватьИсключение "Свойство """ + Свойство.Имя + """ помечено как вложенный DTO,"
+ " но не инициализировано в конструкторе и класс не указан в аннотации";
КонецЕсли;

ВложенныйОбъект = Новый(ИмяКлассаДТО);
СтандартныйРефлектор.УстановитьСвойство(КлассОбъект, Свойство.Имя, ВложенныйОбъект);

КонецЕсли;

ОписаниеПоля.УстановитьВложенныйДТО(ОписатьКласс(ВложенныйОбъект));

КонецЕсли;

КонецЦикла;

ОписанияПолей.Добавить(ОписаниеПоля);

КонецЦикла;

Возврат ОписанияПолей;

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

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

КонтейнерАннотаций = Новый КонтейнерАннотаций;
КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияЗначениеПоУмолчанию"));
КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияСиноним"));
КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияВложенныйДТО"));

КонецПроцедуры
26 changes: 26 additions & 0 deletions src/Классы/АннотацияВложенныйДТО.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Перем _ИмяКлассаДТО; // Строка - имя класса вложенного DTO, пустая строка если не указано

// Возвращает имя аннотации
//
// Возвращаемое значение:
// Строка - имя аннотации
//
Функция ИмяАннотации() Экспорт
Comment thread
nixel2007 marked this conversation as resolved.
Возврат "ВложенныйДТО";
КонецФункции

// Возвращает имя класса вложенного DTO
// Пустая строка означает, что класс не указан и объект
// должен быть создан в конструкторе владеющего класса
//
// Возвращаемое значение:
// Строка - имя класса вложенного DTO
//
Функция ИмяКлассаДТО() Экспорт
Возврат _ИмяКлассаДТО;
КонецФункции

&Аннотация("ВложенныйДТО")
Процедура ПриСозданииОбъекта(Значение = "") Экспорт
_ИмяКлассаДТО = ?(Значение = Неопределено, "", Значение);
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Перем _Значение;

// Возвращает имя аннотации
//
// Возвращаемое значение:
// Строка - имя аннотации
//
Функция ИмяАннотации() Экспорт
Возврат "ЗначениеПоУмолчанию";
КонецФункции

// Возвращает значение по умолчанию
//
// Возвращаемое значение:
// Произвольный - значение по умолчанию
//
Функция Значение() Экспорт
Возврат _Значение;
КонецФункции

&Аннотация("ЗначениеПоУмолчанию")
Процедура ПриСозданииОбъекта(Значение) Экспорт
_Значение = Значение;
КонецПроцедуры
24 changes: 24 additions & 0 deletions src/Классы/АннотацияСиноним.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
Перем _Синоним;

// Возвращает имя аннотации
//
// Возвращаемое значение:
// Строка - имя аннотации
//
Функция ИмяАннотации() Экспорт
Возврат "Синоним";
КонецФункции

// Возвращает синоним (альтернативное имя ключа в конфигурации)
//
// Возвращаемое значение:
// Строка - синоним свойства
//
Функция Синоним() Экспорт
Возврат _Синоним;
КонецФункции

&Аннотация("Синоним")
Процедура ПриСозданииОбъекта(Значение) Экспорт
_Синоним = Значение;
КонецПроцедуры
Loading
Loading