Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
46 changes: 44 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
- [Класс МенеджерПараметров:](#класс-менеджерпараметров)
- [Параметр](#параметр)
- [ЧтениеВыполнено](#чтениевыполнено)
- [ПрочитанныеПараметры](#прочитанныепараметры)
- [Прочитать](#прочитать)
- [УстановитьФайлПараметров](#установитьфайлпараметров)
- [ДобавитьПровайдерПараметров](#добавитьпровайдерпараметров)
- [ОтключитьПровайдер](#отключитьпровайдер)
- [ПровайдерПоИдентификатору](#провайдерпоидентификатору)
- [НастройкаПоискаФайла](#настройкапоискафайла)
- [ИспользоватьПровайдерJSON](#использоватьпровайдерjson)
- [ИспользоватьПровайдерYAML](#использоватьпровайдерyaml)
Expand Down Expand Up @@ -79,6 +81,16 @@
//
```

<a id="markdown-прочитанныепараметры" name="прочитанныепараметры"></a>
#### ПрочитанныеПараметры
```bsl
// Возвращает соответствие прочитанных параметров (сырой результат без обработки конструктором)
//
// Возвращаемое значение:
// Соответствие - прочитанные параметры
//
```

<a id="markdown-прочитать" name="прочитать"></a>
#### Прочитать
```bsl
Expand All @@ -102,9 +114,21 @@
// Добавляет в таблицу провайдеров произвольный класс-провайдер
//
// Параметры:
// КлассОбъект - Объект - класс провайдера или имя класса
// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
// КлассОбъект - Объект - класс провайдера
// Приоритет - Число - числовой приоритет выполнения провайдера;
// меньшее значение читается первым (по умолчанию берётся из провайдера)
// ИдентификаторПровайдера - Строка - явный идентификатор; если не задан - берётся из Идентификатор() провайдера;
// при коллизии автоматически добавляется суффикс #2, #3 и т.д.
//
// Возвращаемое значение:
// Объект - переданный КлассОбъект (для цепочки настроек через .Настройки())
//
```

Пример использования с цепочкой настроек:
```bsl
МП.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровENV, 2).Настройки()
.УстановитьПрефикс("APP_");
```

<a id="markdown-отключитьпровайдер" name="отключитьпровайдер"></a>
Expand All @@ -117,6 +141,24 @@
//
```

<a id="markdown-провайдерпоидентификатору" name="провайдерпоидентификатору"></a>
#### ПровайдерПоИдентификатору
```bsl
// Возвращает класс провайдера по идентификатору для прямой настройки
//
// Параметры:
// ИдентификаторПровайдера - Строка - идентификатор провайдера (например, "json", "yaml#2")
//
// Возвращаемое значение:
// Произвольный - класс провайдера или Неопределено если не найден
//
```

Пример:
```bsl
МП.ПровайдерПоИдентификатору("env").Настройки().УстановитьПрефикс("APP_");
```

<a id="markdown-настройкапоискафайла" name="настройкапоискафайла"></a>
#### НастройкаПоискаФайла
```bsl
Expand Down
1 change: 1 addition & 0 deletions features/build.feature
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
Контекст: Отключение отладки в логах
Допустим Я выключаю отладку лога с именем "oscript.lib.configor"
И Я очищаю параметры команды "opm" в контексте
И Я устанавливаю кодировку вывода "utf-8" команды "opm"

Сценарий: Выполнение команды без параметров
Когда Я добавляю параметр "build ." для команды "opm"
Expand Down
16 changes: 15 additions & 1 deletion features/step_definitions/yaml-provider.os
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,21 @@
Процедура ЯУстанавливаюАвтонастройкиСПараметрами(Знач ТаблицаПараметров) Экспорт

МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
МенеджерПараметров.АвтоНастройка(ТаблицаПараметров[0][0], ТаблицаПараметров[1][0], ТаблицаПараметров[2][0]);
ИмяФайла = ТаблицаПараметров[0][0];
ВложенныйКаталог = ТаблицаПараметров[1][0];
ФорматФайла = ТаблицаПараметров[2][0];

Если НРег(ФорматФайла) = "yaml" Тогда
Провайдер = Новый ПровайдерПараметровYAML;
Иначе
Провайдер = Новый ПровайдерПараметровJSON;
КонецЕсли;

МенеджерПараметров
.ДобавитьПровайдерПараметров(Провайдер, 0)
.Настройки()
.УстановитьИмяФайла(ИмяФайла)
.УстановитьСтандартныеКаталогиПоиска(ВложенныйКаталог);

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

Expand Down
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
//

Описание.Имя("configor")
.Версия("0.11.1")
.Версия("0.12.0")
.Автор("Khorev Aleksey")
.АдресАвтора("Khorevaa@gmail.com")
.Описание("Библиотека для работы с конфигурационными файлами в формате json, yaml")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
// Базовая реализация файлового провайдера параметров.
// Содержит общую механику (поверхность провайдера, чтение/разбор файла),
// а формат-специфичная логика инкапсулирована в объекте-парсере.
//
// Контракт парсера:
// * РасширенияФайлов() - Строка - поддерживаемые расширения (через пробел)
// * РазобратьТекст(Текст) - Соответствие - разбор содержимого файла

#Использовать logos

Перем Лог;

Перем _Приоритет; // Число
Перем _Идентификатор; // Строка
Перем _Настройки; // НастройкиФайловогоПровайдера
Перем _Парсер; // Объект-парсер формата

#Область ПрограммныйИнтерфейс

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

// Устанавливает приоритет провайдера
//
// Параметры:
// НовыйПриоритет - Число - приоритет
//
// Возвращаемое значение:
// Объект.БазовыйФайловыйПровайдер - ссылка на текущий объект
//
Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
_Приоритет = НовыйПриоритет;
Возврат ЭтотОбъект;
КонецФункции

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

// Устанавливает идентификатор провайдера
//
// Параметры:
// НовыйИдентификатор - Строка - идентификатор
//
// Возвращаемое значение:
// Объект.БазовыйФайловыйПровайдер - ссылка на текущий объект
//
Функция УстановитьИдентификатор(Знач НовыйИдентификатор) Экспорт
_Идентификатор = НовыйИдентификатор;
Возврат ЭтотОбъект;
КонецФункции

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

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

// Возвращает объект настроек провайдера
//
// Возвращаемое значение:
// НастройкиФайловогоПровайдера - настройки
//
Функция Настройки() Экспорт
Возврат _Настройки;
КонецФункции

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

// Делегируем поиск и чтение файлов в ФайловыйПровайдерПараметров
ЭффективныеНастройки = _Настройки.ПолучитьНастройки();

ФайловыйПровайдер = Новый ФайловыйПровайдерПараметров(ЭтотОбъект);
Возврат ФайловыйПровайдер.ПрочитатьПараметры(ЭффективныеНастройки);

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

// Выполняет чтение и разбор одного файла параметров
//
// Параметры:
// ПутьКФайлуНастройки - Строка - путь к файлу параметров
//
// Возвращаемое значение:
// Соответствие - итоговые параметры
//
Функция Прочитать(Знач ПутьКФайлуНастройки) Экспорт

РезультатЧтения = Новый Соответствие;

Попытка

Лог.Отладка("ПутьКФайлуНастройки <%1>", ПутьКФайлуНастройки);

РезультатЧтения = РазобратьФайл(ПутьКФайлуНастройки);

Лог.Отладка("Итоговые параметры:");
ПоказатьПараметрыВРежимеОтладки(РезультатЧтения);

Исключение

Лог.Ошибка("Ошибка чтения настроек
|%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));

ВызватьИсключение;

КонецПопытки;

Возврат РезультатЧтения;

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

#КонецОбласти

#Область Вспомогательные_процедуры_и_функции

Функция РазобратьФайл(Знач ПутьКФайлуНастройки)

ФайлНастроек = Новый Файл(ПутьКФайлуНастройки);
ИмяФайла = ФайлНастроек.ПолноеИмя;

Лог.Отладка("Путь файла настроек <%1>", ИмяФайла);

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

Текст = ПрочитатьТекстФайла(ИмяФайла);

Лог.Отладка("Текст файла настроек:
|%1", Текст);

Возврат _Парсер.РазобратьТекст(Текст);

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

Функция ПрочитатьТекстФайла(Знач ИмяФайла)

Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Текст = Чтение.Прочитать();
Чтение.Закрыть();

Возврат Текст;

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

Процедура ПоказатьПараметрыВРежимеОтладки(ЗначенияПараметров)

ПроцессорВывода = Новый ВыводВРежимеОтладки(Лог);
ПроцессорВывода.ПоказатьНастройкиВРежимеОтладки(ЗначенияПараметров);

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

#КонецОбласти

Процедура ПриСозданииОбъекта(Знач Парсер, Знач ИдентификаторПровайдера, Знач Приоритет, Знач ИмяЛога)

_Парсер = Парсер;
_Идентификатор = ИдентификаторПровайдера;
_Приоритет = Приоритет;
_Настройки = Новый НастройкиФайловогоПровайдера;

Лог = Логирование.ПолучитьЛог(ИмяЛога);

КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@

Перем Префикс; // Строка - префикс фильтрации переменных среды

#Область Публичное_API

// Устанавливает префикс фильтрации переменных среды
//
// Параметры:
// ПрефиксФильтра - Строка - префикс
//
// Возвращаемое значение:
// НастройкиПровайдераENV - ссылка на текущий объект
//
Функция УстановитьПрефикс(Знач ПрефиксФильтра) Экспорт
Префикс = ПрефиксФильтра;
Возврат ЭтотОбъект;
КонецФункции

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

#КонецОбласти

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

Перем мПараметры; // Соответствие

#Область Публичное_API

// Устанавливает источник параметров
//
// Параметры:
// ИсточникПараметров - Соответствие - источник параметров
//
// Возвращаемое значение:
// НастройкиПровайдераСоответствие - ссылка на текущий объект
//
Функция УстановитьПараметры(Знач ИсточникПараметров) Экспорт

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

мПараметры = ИсточникПараметров;
Возврат ЭтотОбъект;

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

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

#КонецОбласти

Процедура ПриСозданииОбъекта(НачальныеПараметры = Неопределено)

Если НачальныеПараметры <> Неопределено Тогда
УстановитьПараметры(НачальныеПараметры);
Иначе
мПараметры = Новый Соответствие;
КонецЕсли;

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