diff --git a/.github/workflows/perfomance.yml b/.github/workflows/perfomance.yml index 0edc8b8..d35cd3c 100644 --- a/.github/workflows/perfomance.yml +++ b/.github/workflows/perfomance.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - oscript_version: ['dev', 'lts', 'default'] + oscript_version: ['dev', 'default'] uses: autumn-library/workflows/.github/workflows/test.yml@main with: oscript_version: ${{ matrix.oscript_version }} diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1efcd54..e237c3b 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - oscript_version: ['dev', 'lts', 'default'] + oscript_version: ['dev', 'default'] uses: autumn-library/workflows/.github/workflows/test.yml@main with: oscript_version: ${{ matrix.oscript_version }} diff --git "a/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md" "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md" index 484c883..1ac9d49 100644 --- "a/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md" +++ "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/20-\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.md" @@ -4,6 +4,22 @@ title: СоветДругогоМастера # СоветДругогоМастера +Объект-носитель пользовательских настроек, передаваемый в [`Поделка`](../../../api/050-Классы/) при её создании. + +С версии 4.4 рекомендуется использовать [`СтроительМенеджераПараметров`](25-СтроительМенеджераПараметров.md), доступный через метод `ПолучитьСтроительМенеджераПараметров()`. Старые методы (`ЗначенияДеталек`, `ПрефиксПеременныхСреды`, `ИмяФайлаСоЗначениямиДеталек`, `ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек`) объявлены **устаревшими**: при их вызове в лог пишется предупреждение, под капотом они модифицируют тот же строитель. + +## ПолучитьСтроительМенеджераПараметров + +```bsl +// Возвращает строитель с применёнными значениями устаревших полей. +// Используется Поделкой при инициализации МенеджерПараметров. +// +// Возвращаемое значение: +// СтроительМенеджераПараметров - готовый к использованию строитель +// +Функция ПолучитьСтроительМенеджераПараметров() Экспорт +``` + ## ПриСозданииОбъекта ```bsl @@ -12,58 +28,34 @@ title: СоветДругогоМастера Процедура ПриСозданииОбъекта() ``` -## ЗначенияДеталек +## ЗначенияДеталек + +Используйте `ПолучитьСтроительМенеджераПараметров().ДобавитьПровайдерСоответствие(...)`. ```bsl -// Установить/получить значения деталек. -// -// Параметры: -// НовоеЗначение - Соответствие - устанавливаемые значения деталек. -// -// Возвращаемое значение: -// Соответствие, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. -// Функция ЗначенияДеталек(НовоеЗначение = Неопределено) Экспорт ``` -## ПрефиксПеременныхСреды +## ПрефиксПеременныхСреды + +Используйте `ПолучитьСтроительМенеджераПараметров().Провайдер("env").Настройки().УстановитьПрефикс(...)`. ```bsl -// Установить/получить префикс переменных среды, хранящих значения деталек. -// -// Параметры: -// НовоеЗначение - Строка - устанавливаемый префикс переменных среды. -// -// Возвращаемое значение: -// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. -// Функция ПрефиксПеременныхСреды(НовоеЗначение = Неопределено) Экспорт ``` -## ИмяФайлаСоЗначениямиДеталек +## ИмяФайлаСоЗначениямиДеталек + +Используйте `ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьИмяФайла(...)`. ```bsl -// Установить/получить имя файла (без расширения), в котором хранятся значения деталек. -// -// Параметры: -// НовоеЗначение - Строка - устанавливаемое имя файла. -// -// Возвращаемое значение: -// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. -// Функция ИмяФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт ``` -## ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек +## ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек + +Используйте `ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьСтандартныеКаталогиПоиска(...)`. ```bsl -// Установить/получить относительный путь к каталогу, где хранятся файл со значениями деталек. -// -// Параметры: -// НовоеЗначение - Строка - устанавливаемый путь к каталогу. -// -// Возвращаемое значение: -// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. -// Функция ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт ``` diff --git "a/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/25-\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.md" "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/25-\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.md" new file mode 100644 index 0000000..62eb7e0 --- /dev/null +++ "b/docs/api/050-\320\232\320\273\320\260\321\201\321\201\321\213/25-\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.md" @@ -0,0 +1,236 @@ +--- +title: СтроительМенеджераПараметров +--- + +# СтроительМенеджераПараметров + +Инкапсулирует создание и настройку `МенеджерПараметров` (`configor`) с заранее заданным дефолтным составом провайдеров. + +Создаётся лениво при первом обращении к [`СоветДругогоМастера.ПолучитьСтроительМенеджераПараметров()`](20-СоветДругогоМастера.md#получитьстроительменеджерапараметров) и кэшируется в `СоветДругогоМастера`: повторные вызовы возвращают тот же экземпляр, поэтому правки строителя, сделанные клиентским кодом, доходят до `Поделки`. Все настройки выполняются **до** передачи `СоветДругогоМастера` в [`Поделка`](../../../api/050-Классы/). + +## Дефолтный состав провайдеров + +| Идентификатор | Тип | Приоритет | +| --- | --- | --- | +| `env` | `ПровайдерПараметровENV` | 1 | +| `default` | Файловый метапровайдер (`yaml` + `json` + `ini`)
имя файла `autumn-properties`, поиск с подкаталогом `src` | 2 | +| `inline` | `ПровайдерПараметровСоответствие` | 3 | + +Файловый метапровайдер регистрирует три физических провайдера в менеджере под идентификаторами `<база>-yaml`, `<база>-json`, `<база>-ini` с одинаковым приоритетом. Настройки, заданные через метапровайдер (имя файла, каталоги поиска и т.п.), транслируются во все три физических провайдера. + +## Канонический нейминг + +Методы добавления провайдеров следуют единой схеме `ДобавитьПровайдер<Тип>`: + +| Метод | Назначение | +| --- | --- | +| `ДобавитьПровайдер` | универсальный — для произвольного класса-провайдера | +| `ДобавитьПровайдерСоответствие` | inline-значения через `Соответствие` | +| `ДобавитьПровайдерENV` | переменные среды | +| `ДобавитьПровайдерФайлов` | мета-обёртка над несколькими форматами (`yaml`/`json`/`ini`) | +| `ДобавитьПровайдерФайлНастроек` | один файл с автоопределением формата по расширению | + +## Пример + +```bsl +Совет = Новый СоветДругогоМастера(); +Строитель = Совет.ПолучитьСтроительМенеджераПараметров(); + +// Заменить дефолтный inline-провайдер своим набором значений +Значения = Новый Соответствие(); +Значения.Вставить("моя.настройка", "значение"); +Строитель.УдалитьПровайдер("inline"); +Строитель.ДобавитьПровайдерСоответствие(Значения, 3, "inline"); + +// Добавить ещё один файловый метапровайдер +ДопФайлы = Строитель.ДобавитьПровайдерФайлов("dev", 1); +ДопФайлы.УстановитьИмяФайла("autumn-properties.dev"); + +// Подключить конкретный файл (формат — по расширению) +Строитель.ДобавитьПровайдерФайлНастроек("./config/local.yaml", 0, "local"); + +// Полностью пересобрать состав с нуля +Строитель.ОчиститьПровайдеры(); +Строитель.ДобавитьПровайдерENV("MYAPP_", 1, "env"); +Строитель.ДобавитьПровайдерСоответствие(Значения, 2, "inline"); + +Поделка = Новый Поделка(Совет); +``` + +## МенеджерПараметров + +```bsl +// Возвращает внутренний МенеджерПараметров configor. +// +// Возвращаемое значение: +// МенеджерПараметров +// +Функция МенеджерПараметров() Экспорт +``` + +## ДобавитьПровайдер + +```bsl +// Регистрирует произвольный класс-провайдер в менеджере. +// +// Параметры: +// КлассПровайдера - Объект - класс, реализующий интерфейс провайдера configor +// Приоритет - Число - приоритет +// Идентификатор - Строка - явный идентификатор; при коллизии configor добавит #2, #3, ... +// +// Возвращаемое значение: +// Объект - переданный КлассПровайдера +// +Функция ДобавитьПровайдер(Знач КлассПровайдера, Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт +``` + +## ДобавитьПровайдерСоответствие + +```bsl +// Регистрирует ПровайдерПараметровСоответствие с заданными значениями. +// +// Параметры: +// Значения - Соответствие - значения параметров (по умолчанию пустое) +// Приоритет - Число +// Идентификатор - Строка +// +// Возвращаемое значение: +// ПровайдерПараметровСоответствие +// +Функция ДобавитьПровайдерСоответствие(Знач Значения = Неопределено, Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт +``` + +## ДобавитьПровайдерENV + +```bsl +// Регистрирует ПровайдерПараметровENV. +// +// Параметры: +// Префикс - Строка - префикс переменных среды +// Приоритет - Число +// Идентификатор - Строка +// +// Возвращаемое значение: +// ПровайдерПараметровENV +// +Функция ДобавитьПровайдерENV(Знач Префикс = "", Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт +``` + +## ДобавитьПровайдерФайлов + +```bsl +// Регистрирует файловый метапровайдер — обёртку над несколькими физическими +// файловыми провайдерами (yaml/json/ini) с одинаковым приоритетом. +// +// Параметры: +// Идентификатор - Строка - базовый идентификатор метапровайдера +// Приоритет - Число +// Форматы - Строка - список форматов через пробел (по умолчанию "yaml json ini") +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция ДобавитьПровайдерФайлов(Знач Идентификатор, Знач Приоритет, Знач Форматы = "yaml json ini") Экспорт +``` + +## ДобавитьПровайдерФайлНастроек + +```bsl +// Регистрирует один файловый провайдер по конкретному пути к файлу. +// Формат определяется по расширению (.yaml/.yml — yaml, .json — json, .ini — ini). +// +// Параметры: +// ПутьКФайлу - Строка - полный или относительный путь к файлу настроек +// Приоритет - Число +// Идентификатор - Строка +// +// Возвращаемое значение: +// Объект - класс-провайдер (ПровайдерПараметровYAML/JSON/INI) +// +Функция ДобавитьПровайдерФайлНастроек(Знач ПутьКФайлу, Знач Приоритет = Неопределено, Знач Идентификатор = Неопределено) Экспорт +``` + +## УдалитьПровайдер + +```bsl +// Удаляет (отключает) провайдер по идентификатору. +// +// Если идентификатор соответствует файловому метапровайдеру — +// отключает все его физические провайдеры и удаляет метапровайдер из реестра. +// +// Параметры: +// Идентификатор - Строка +// +Процедура УдалитьПровайдер(Знач Идентификатор) Экспорт +``` + +## ОчиститьПровайдеры + +```bsl +// Полностью очищает состав провайдеров: пересоздаёт МенеджерПараметров +// и сбрасывает реестр файловых метапровайдеров. +// +// Полезно когда нужно собрать собственную композицию с нуля, +// не наследуя дефолтный состав (env / default / inline). +// +Процедура ОчиститьПровайдеры() Экспорт +``` + +## Провайдер + +```bsl +// Возвращает обёртку ПровайдерПараметров (configor) по идентификатору. +// +// Параметры: +// Идентификатор - Строка +// +// Возвращаемое значение: +// ПровайдерПараметров (обёртка configor) или Неопределено +// +Функция Провайдер(Знач Идентификатор) Экспорт +``` + +## ПровайдерФайлов + +```bsl +// Возвращает зарегистрированный файловый метапровайдер. +// +// Параметры: +// Идентификатор - Строка +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция ПровайдерФайлов(Знач Идентификатор) Экспорт +``` + +## НастройкаПоискаФайла + +```bsl +// Возвращает глобальный объект настроек поиска файлов МенеджерПараметров +// (общий fallback для всех файловых провайдеров). +// +// Возвращаемое значение: +// НастройкиФайловогоПровайдера +// +Функция НастройкаПоискаФайла() Экспорт +``` + +## Файловый метапровайдер + +Возвращается методами `ДобавитьПровайдерФайлов` / `ПровайдерФайлов`. Проксирует настройки сразу в физические провайдеры (`<база>-yaml`, `<база>-json`, `<база>-ini`). + +Доступные методы: + +- `Идентификатор()` — базовый идентификатор +- `ИдентификаторыФизическихПровайдеров()` — фиксированный массив идентификаторов +- `Форматы()` — фиксированный массив форматов +- `Настройки(Формат)` — `НастройкиФайловогоПровайдера` конкретного физического провайдера +- `УстановитьПриоритет(Приоритет)` +- `УстановитьИмяФайла(Имя)` +- `УстановитьФайлПараметров(Путь)` +- `УстановитьСтандартныеКаталогиПоиска(ВложенныйКаталог = "")` +- `ДобавитьКаталогПоиска(Каталог)` +- `ОчиститьПутиПоиска()` +- `УстановитьВложенныйКаталогПоиска(ВложенныйКаталог)` +- `Отключить()` / `Включить()` diff --git a/docs/api/index.md b/docs/api/index.md index adbe76c..b8336ef 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -52,6 +52,7 @@ ## Классы * [СоветДругогоМастера](Классы/СоветДругогоМастера) +* [СтроительМенеджераПараметров](Классы/СтроительМенеджераПараметров.md) * [Завязь](Классы/Завязь.md) * [Табакерка](Классы/Табакерка.md) * [ОпределениеЖелудя](Классы/ОпределениеЖелудя.md) diff --git a/packagedef b/packagedef index 9e697e6..f82449d 100644 --- a/packagedef +++ b/packagedef @@ -5,18 +5,18 @@ Описание.Имя("autumn") - .Версия("4.3.13") + .Версия("5.0.0") .Автор("Nikita Fedkin") .АдресАвтора("nixel2007@gmail.com") .Описание("Dependency injection framework для OneScript") - .ВерсияСреды("1.9.2") + .ВерсияСреды("2.0.0") .ВключитьФайл("src") .ВключитьФайл("tests") .ВключитьФайл("LICENSE.md") .ВключитьФайл("README.md") .ЗависитОт("annotations", "1.6.0") .ЗависитОт("asserts", "1.4.0") - .ЗависитОт("configor", "0.9.1") + .ЗависитОт("configor", "0.12.0") .ЗависитОт("logos", "1.7.1") .ЗависитОт("fluent", "0.6.1") .ЗависитОт("reflector", "0.7.1") diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" new file mode 100644 index 0000000..2271355 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -0,0 +1,295 @@ +// Строитель МенеджерПараметров для autumn. +// +// Инкапсулирует создание и настройку МенеджерПараметров (configor) +// с заранее заданным дефолтным составом провайдеров. +// +// Дефолтный состав: +// * env — ПровайдерПараметровENV, приоритет 1 +// * default — ФайловыйМетапровайдер (yaml + json + ini), приоритет 2, +// имя файла "autumn-properties", стандартные каталоги поиска с подкаталогом "src" +// * inline — ПровайдерПараметровСоответствие, приоритет 3 +// +// Создается и настраивается ДО передачи СоветДругогоМастера в Поделку. +// Поделка забирает уже сконфигурированный МенеджерПараметров через метод МенеджерПараметров(). +// +// Канонический нейминг методов добавления: +// ДобавитьПровайдер — общий, для произвольного класса-провайдера +// ДобавитьПровайдерСоответствие — inline-значения через Соответствие +// ДобавитьПровайдерENV — переменные среды +// ДобавитьПровайдерФайлов — мета-обёртка над несколькими форматами (yaml/json/ini) +// ДобавитьПровайдерФайлНастроек — один файл с автоопределением формата по расширению +// + +#Использовать configor + +Перем _МенеджерПараметров; // МенеджерПараметров (configor) +Перем _ФайловыеМетапровайдеры; // Соответствие: идентификатор -> ФайловыйМетапровайдер + +#Область ПрограммныйИнтерфейс + +// Считывает значения из всех зарегистрированных провайдеров. +// +Процедура Прочитать() Экспорт + _МенеджерПараметров.Прочитать(); +КонецПроцедуры + +// Возвращает значение параметра по имени. +// +// Параметры: +// Имя - Строка +// ЗначениеПоУмолчанию - Произвольный +// +// Возвращаемое значение: +// Произвольный +// +Функция Параметр(Знач Имя, Знач ЗначениеПоУмолчанию = Неопределено) Экспорт + Возврат _МенеджерПараметров.Параметр(Имя, ЗначениеПоУмолчанию); +КонецФункции + +Функция МенеджерПараметров() + Возврат _МенеджерПараметров; +КонецФункции + +// Регистрирует произвольный класс-провайдер в менеджере. +// +// Параметры: +// КлассПровайдера - Объект - класс, реализующий интерфейс провайдера configor +// Приоритет - Число - приоритет (по умолчанию берётся из самого провайдера) +// Идентификатор - Строка - явный идентификатор; при коллизии configor сам добавит #2, #3, ... +// +// Возвращаемое значение: +// Объект - переданный КлассПровайдера (для chain-настроек через .Настройки()) +// +Функция ДобавитьПровайдер(Знач КлассПровайдера, + Знач Приоритет = Неопределено, + Знач Идентификатор = Неопределено) Экспорт + + _МенеджерПараметров.ДобавитьПровайдерПараметров(КлассПровайдера, Приоритет, Идентификатор); + Возврат КлассПровайдера; + +КонецФункции + +// Регистрирует ПровайдерПараметровСоответствие с заданными значениями. +// +// Параметры: +// Значения - Соответствие - значения параметров +// Приоритет - Число +// Идентификатор - Строка +// +// Возвращаемое значение: +// ПровайдерПараметровСоответствие +// +Функция ДобавитьПровайдерСоответствие(Знач Значения, + Знач Приоритет = Неопределено, + Знач Идентификатор = Неопределено) Экспорт + + Провайдер = Новый ПровайдерПараметровСоответствие(Значения); + Возврат ДобавитьПровайдер(Провайдер, Приоритет, Идентификатор); + +КонецФункции + +// Регистрирует ПровайдерПараметровENV. +// +// Параметры: +// Префикс - Строка - префикс переменных среды +// Приоритет - Число +// Идентификатор - Строка +// +// Возвращаемое значение: +// ПровайдерПараметровENV +// +Функция ДобавитьПровайдерENV(Знач Префикс = "", + Знач Приоритет = Неопределено, + Знач Идентификатор = Неопределено) Экспорт + + Провайдер = Новый ПровайдерПараметровENV(Префикс); + Возврат ДобавитьПровайдер(Провайдер, Приоритет, Идентификатор); + +КонецФункции + +// Регистрирует файловый метапровайдер — обёртку над несколькими физическими +// файловыми провайдерами (yaml/json/ini) с одинаковым приоритетом. +// +// Каждый физический провайдер получает идентификатор вида "<база>-<формат>". +// Через возвращаемую обёртку можно настраивать имя файла, каталоги поиска +// и т.п. сразу для всех физических провайдеров. +// +// Параметры: +// Идентификатор - Строка - базовый идентификатор метапровайдера +// Приоритет - Число - общий приоритет +// Форматы - Строка - список форматов через пробел (по умолчанию "yaml json ini") +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция ДобавитьПровайдерФайлов(Знач Идентификатор, + Знач Приоритет = Неопределено, + Знач Форматы = "yaml json ini") Экспорт + + Если _ФайловыеМетапровайдеры.Получить(Идентификатор) <> Неопределено Тогда + ВызватьИсключение СтрШаблон("Файловый метапровайдер с идентификатором <%1> уже зарегистрирован", Идентификатор); + КонецЕсли; + + Метапровайдер = Новый ФайловыйМетапровайдер(_МенеджерПараметров, Идентификатор, Приоритет, Форматы); + _ФайловыеМетапровайдеры.Вставить(Идентификатор, Метапровайдер); + Возврат Метапровайдер; + +КонецФункции + +// Регистрирует один файловый провайдер по конкретному пути к файлу. +// Формат определяется по расширению (.yaml/.yml — yaml, .json — json, .ini — ini). +// +// Параметры: +// ПутьКФайлу - Строка - полный или относительный путь к файлу настроек +// Приоритет - Число +// Идентификатор - Строка +// +// Возвращаемое значение: +// Объект - класс-провайдер (ПровайдерПараметровYAML/JSON/INI) +// +Функция ДобавитьПровайдерФайлНастроек(Знач ПутьКФайлу, + Знач Приоритет = Неопределено, + Знач Идентификатор = Неопределено) Экспорт + + Формат = ОпределитьФорматПоРасширению(ПутьКФайлу); + Провайдер = СоздатьФизическийПровайдерПоФормату(Формат); + ДобавитьПровайдер(Провайдер, Приоритет, Идентификатор); + Провайдер.Настройки().УстановитьФайлПараметров(ПутьКФайлу); + Возврат Провайдер; + +КонецФункции + +// Удаляет (отключает) провайдер по идентификатору. +// +// Если идентификатор соответствует файловому метапровайдеру — +// отключает все его физические провайдеры и удаляет метапровайдер из реестра. +// +// Параметры: +// Идентификатор - Строка - идентификатор провайдера или базовый идентификатор метапровайдера +// +Процедура УдалитьПровайдер(Знач Идентификатор) Экспорт + + Метапровайдер = _ФайловыеМетапровайдеры.Получить(Идентификатор); + + Если Метапровайдер <> Неопределено Тогда + Для Каждого ИдФизического Из Метапровайдер.ИдентификаторыФизическихПровайдеров() Цикл + _МенеджерПараметров.ОтключитьПровайдер(ИдФизического); + КонецЦикла; + _ФайловыеМетапровайдеры.Удалить(Идентификатор); + Возврат; + КонецЕсли; + + _МенеджерПараметров.ОтключитьПровайдер(Идентификатор); + +КонецПроцедуры + +// Полностью очищает состав провайдеров: пересоздаёт МенеджерПараметров +// и сбрасывает реестр файловых метапровайдеров. +// +// Полезно когда нужно собрать собственную композицию с нуля, +// не наследуя дефолтный состав (env / default / inline). +// +Процедура ОчиститьПровайдеры() Экспорт + + _МенеджерПараметров = Новый МенеджерПараметров; + _ФайловыеМетапровайдеры = Новый Соответствие; + +КонецПроцедуры + +// Возвращает обёртку ПровайдерПараметров (configor) по идентификатору. +// +// Через возвращаемый объект можно изменить приоритет, идентификатор, +// получить настройки конкретного провайдера через .Настройки(). +// +// Параметры: +// Идентификатор - Строка - идентификатор физического провайдера +// +// Возвращаемое значение: +// ПровайдерПараметров (обёртка configor) или Неопределено +// +Функция Провайдер(Знач Идентификатор) Экспорт + Возврат _МенеджерПараметров.ПровайдерПоИдентификатору(Идентификатор); +КонецФункции + +// Возвращает зарегистрированный файловый метапровайдер. +// +// Параметры: +// Идентификатор - Строка - базовый идентификатор метапровайдера +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция ПровайдерФайлов(Знач Идентификатор) Экспорт + + Метапровайдер = _ФайловыеМетапровайдеры.Получить(Идентификатор); + Если Метапровайдер = Неопределено Тогда + ВызватьИсключение СтрШаблон("Файловый метапровайдер с идентификатором <%1> не найден", Идентификатор); + КонецЕсли; + Возврат Метапровайдер; + +КонецФункции + +// Возвращает глобальный объект настроек поиска файлов МенеджерПараметров +// (общий fallback для всех файловых провайдеров). +// +// Возвращаемое значение: +// НастройкиФайловогоПровайдера +// +Функция НастройкаПоискаФайла() Экспорт + Возврат _МенеджерПараметров.НастройкаПоискаФайла(); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ОпределитьФорматПоРасширению(Знач ПутьКФайлу) + + Файл = Новый Файл(ПутьКФайлу); + Расширение = НРег(Файл.Расширение); + + Если Расширение = ".yaml" ИЛИ Расширение = ".yml" Тогда + Возврат "yaml"; + ИначеЕсли Расширение = ".json" Тогда + Возврат "json"; + ИначеЕсли Расширение = ".ini" Тогда + Возврат "ini"; + КонецЕсли; + + ВызватьИсключение СтрШаблон( + "Не удалось определить формат файла настроек по расширению <%1>." + " Поддерживаются: .yaml, .yml, .json, .ini.", + Расширение + ); + +КонецФункции + +Функция СоздатьФизическийПровайдерПоФормату(Знач Формат) + + Если Формат = "yaml" Тогда + Возврат Новый ПровайдерПараметровYAML; + ИначеЕсли Формат = "json" Тогда + Возврат Новый ПровайдерПараметровJSON; + ИначеЕсли Формат = "ini" Тогда + Возврат Новый ПровайдерПараметровINI; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область Инициализация + +Процедура ПриСозданииОбъекта() + + ОчиститьПровайдеры(); + + ДобавитьПровайдерENV("", 1, "env"); + + ФайловыйПровайдерПоУмолчанию = ДобавитьПровайдерФайлов("default", 2); + ФайловыйПровайдерПоУмолчанию.УстановитьИмяФайла("autumn-properties"); + ФайловыйПровайдерПоУмолчанию.УстановитьСтандартныеКаталогиПоиска("src"); + +КонецПроцедуры + +#КонецОбласти diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" index 32c49b5..664c414 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\226\320\265\320\273\321\203\320\264\320\265\320\271.os" @@ -4,7 +4,7 @@ #Использовать reflector #Область ОписаниеПеременных - + // Поделка - Управляющий ioc-контейнер. Перем Поделка; // РазворачивательАннотаций - разворачиватель аннотаций свойств и методов желудей. @@ -500,36 +500,36 @@ КонецФункции -Функция ПрочитатьТипЖелудя(Метод, Аннотации, Родитель) - - Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Завязь"); - ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( - Аннотация, - "Тип" - ); - - Если ТипЖелудя = Неопределено Тогда - ТипЖелудя = Метод.Имя; - КонецЕсли; - - Попытка - РеальныйТип = Тип(ТипЖелудя); - Исключение - Если ТипЗнч(Родитель) = Тип("Сценарий") Тогда - ВызватьИсключение СтрШаблон( - "Тип желудя в лямбда-завязи не известен. Укажите тип желудя в аннотации &Завязь. Лямбда: %1", - Родитель - ); - Иначе - ВызватьИсключение СтрШаблон( - "Тип желудя в Завязи %1 класса %2 не известен. Укажите тип желудя в аннотации или переименуйте метод завязи.", - Метод.Имя, - Родитель - ); - КонецЕсли; - КонецПопытки; - - Возврат РеальныйТип; +Функция ПрочитатьТипЖелудя(Метод, Аннотации, Родитель) + + Аннотация = РаботаСАннотациями.НайтиАннотацию(Аннотации, "Завязь"); + ТипЖелудя = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации( + Аннотация, + "Тип" + ); + + Если ТипЖелудя = Неопределено Тогда + ТипЖелудя = Метод.Имя; + КонецЕсли; + + Попытка + РеальныйТип = Тип(ТипЖелудя); + Исключение + Если ТипЗнч(Родитель) = Тип("Сценарий") Тогда + ВызватьИсключение СтрШаблон( + "Тип желудя в лямбда-завязи не известен. Укажите тип желудя в аннотации &Завязь. Лямбда: %1", + Родитель + ); + Иначе + ВызватьИсключение СтрШаблон( + "Тип желудя в Завязи %1 класса %2 не известен. Укажите тип желудя в аннотации или переименуйте метод завязи.", + Метод.Имя, + Родитель + ); + КонецЕсли; + КонецПопытки; + + Возврат РеальныйТип; КонецФункции Функция ПрочитатьПрилепляемыеЧастицыВМетоде(Метод, ВладелецСвойств) diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\234\320\265\321\202\320\260\320\277\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\234\320\265\321\202\320\260\320\277\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200.os" new file mode 100644 index 0000000..e1c1a25 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\271\320\273\320\276\320\262\321\213\320\271\320\234\320\265\321\202\320\260\320\277\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200.os" @@ -0,0 +1,294 @@ +// Метапровайдер, объединяющий несколько физических файловых провайдеров +// (yaml/json/ini) configor под одним базовым идентификатором. +// +// Регистрирует каждый физический провайдер в МенеджерПараметров с идентификатором +// вида "<база>-<формат>" (например "default-yaml", "default-json", "default-ini") +// и общим приоритетом. Проксирует операции настройки на per-provider .Настройки(). +// +// Создается через СтроительМенеджераПараметров.ДобавитьПровайдерФайлов. +// + +#Использовать configor + +Перем БазовыйИдентификатор; // Строка +Перем Провайдеры; // Соответствие: формат -> ПровайдерПараметров (обёртка configor) + +#Область ПрограммныйИнтерфейс + +// Возвращает базовый идентификатор метапровайдера +// +// Возвращаемое значение: +// Строка - базовый идентификатор +// +Функция Идентификатор() Экспорт + Возврат БазовыйИдентификатор; +КонецФункции + +// Возвращает массив идентификаторов физических провайдеров, зарегистрированных в менеджере +// +// Возвращаемое значение: +// ФиксированныйМассив - массив строк-идентификаторов +// +Функция ИдентификаторыФизическихПровайдеров() Экспорт + + Результат = Новый Массив; + Для Каждого КлючЗначение Из Провайдеры Цикл + Результат.Добавить(КлючЗначение.Значение.Идентификатор); + КонецЦикла; + Возврат Новый ФиксированныйМассив(Результат); + +КонецФункции + +// Возвращает массив форматов, которые покрывает метапровайдер +// +// Возвращаемое значение: +// ФиксированныйМассив - массив строк-форматов +// +Функция Форматы() Экспорт + + Результат = Новый Массив; + Для Каждого КлючЗначение Из Провайдеры Цикл + Результат.Добавить(КлючЗначение.Ключ); + КонецЦикла; + Возврат Новый ФиксированныйМассив(Результат); + +КонецФункции + +// Возвращает per-provider настройки физического провайдера для конкретного формата +// +// Параметры: +// Формат - Строка - один из "yaml", "json", "ini" +// +// Возвращаемое значение: +// НастройкиФайловогоПровайдера +// +Функция Настройки(Знач Формат) Экспорт + Возврат ПолучитьПровайдер(Формат).Настройки(); +КонецФункции + +// Устанавливает приоритет всем физическим провайдерам метапровайдера +// +// Параметры: +// НовыйПриоритет - Число - приоритет +// +// Возвращаемое значение: +// ФайловыйМетапровайдер - ЭтотОбъект для chain +// +Функция УстановитьПриоритет(Знач НовыйПриоритет) Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.УстановитьПриоритет(НовыйПриоритет); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Прокси: установить имя файла для всех физических провайдеров +// +// Параметры: +// ИмяФайла - Строка - имя файла без расширения +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция УстановитьИмяФайла(Знач ИмяФайла) Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Настройки().УстановитьИмяФайла(ИмяФайла); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Прокси: установить путь к конкретному файлу параметров. +// +// Запрещён, если метапровайдер собран более чем из одного формата: +// прокидывание одного и того же пути во все форматы (yaml/json/ini) +// заведомо некорректно — формат файла однозначен. Для регистрации +// конкретного файла используйте СтроительМенеджераПараметров.ДобавитьПровайдерФайлНастроек(...), +// который определяет формат по расширению. +// +// Параметры: +// ПутьКФайлу - Строка - полный путь к файлу +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция УстановитьФайлПараметров(Знач ПутьКФайлу) Экспорт + + Если Провайдеры.Количество() > 1 Тогда + ВызватьИсключение СтрШаблон( + "Метод УстановитьФайлПараметров неприменим к файловому метапровайдеру <%1>," + " объединяющему более одного формата (форматов: %2)." + " Используйте СтроительМенеджераПараметров.ДобавитьПровайдерФайлНастроек(...).", + БазовыйИдентификатор, Провайдеры.Количество() + ); + КонецЕсли; + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Настройки().УстановитьФайлПараметров(ПутьКФайлу); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Прокси: установить стандартные каталоги поиска для всех физических провайдеров +// +// Параметры: +// ВложенныйПодкаталог - Строка - дополнительный подкаталог в стандартных каталогах +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция УстановитьСтандартныеКаталогиПоиска(Знач ВложенныйПодкаталог = "") Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Настройки().УстановитьСтандартныеКаталогиПоиска(ВложенныйПодкаталог); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Прокси: добавить дополнительный каталог поиска +// +// Параметры: +// ПутьПоискаФайлов - Строка - полный путь к каталогу +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция ДобавитьКаталогПоиска(Знач ПутьПоискаФайлов) Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Настройки().ДобавитьКаталогПоиска(ПутьПоискаФайлов); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Прокси: очистить все пути поиска +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция ОчиститьПутиПоиска() Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Настройки().ОчиститьПутиПоиска(); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Прокси: установить вложенный каталог поиска для всех физических провайдеров +// +// Параметры: +// ИмяВложенногоКаталогаПоиска - Строка - вложенный каталог +// +// Возвращаемое значение: +// ФайловыйМетапровайдер +// +Функция УстановитьВложенныйКаталогПоиска(Знач ИмяВложенногоКаталогаПоиска) Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Настройки().УстановитьВложенныйКаталогПоиска(ИмяВложенногоКаталогаПоиска); + КонецЦикла; + Возврат ЭтотОбъект; + +КонецФункции + +// Отключает все физические провайдеры метапровайдера +// +Процедура Отключить() Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Отключить(); + КонецЦикла; + +КонецПроцедуры + +// Включает все физические провайдеры метапровайдера +// +Процедура Включить() Экспорт + + Для Каждого КлючЗначение Из Провайдеры Цикл + КлючЗначение.Значение.Включить(); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьПровайдер(Знач Формат) + + Провайдер = Провайдеры.Получить(НРег(Формат)); + Если Провайдер = Неопределено Тогда + ВызватьИсключение СтрШаблон( + "Формат <%1> не зарегистрирован в файловом метапровайдере <%2>", + Формат, БазовыйИдентификатор + ); + КонецЕсли; + Возврат Провайдер; + +КонецФункции + +Функция СоздатьФизическийПровайдер(Знач Формат) + + Если Формат = "yaml" Тогда + Возврат Новый ПровайдерПараметровYAML; + ИначеЕсли Формат = "json" Тогда + Возврат Новый ПровайдерПараметровJSON; + ИначеЕсли Формат = "ini" Тогда + Возврат Новый ПровайдерПараметровINI; + КонецЕсли; + + ВызватьИсключение СтрШаблон( + "Неизвестный формат файлового провайдера: <%1>. Поддерживаются: yaml, json, ini.", + Формат + ); + +КонецФункции + +#КонецОбласти + +#Область Инициализация + +// Параметры: +// МенеджерПараметровРодитель - МенеджерПараметров - менеджер configor, в который регистрировать +// ИдентификаторБазовый - Строка - базовый идентификатор метапровайдера +// Приоритет - Число - общий приоритет для всех физических провайдеров +// Форматы - Строка - список форматов через пробел (по умолчанию "yaml json ini") +// +Процедура ПриСозданииОбъекта(Знач МенеджерПараметровРодитель, + Знач ИдентификаторБазовый, + Знач Приоритет, + Знач Форматы = "yaml json ini") + + БазовыйИдентификатор = ИдентификаторБазовый; + Провайдеры = Новый Соответствие; + + МассивФорматов = СтрРазделить(НРег(Форматы), " ", Ложь); + + Для Каждого Формат Из МассивФорматов Цикл + + Если ПустаяСтрока(Формат) Тогда + Продолжить; + КонецЕсли; + + ИдентификаторФизический = БазовыйИдентификатор + "-" + Формат; + КлассПровайдера = СоздатьФизическийПровайдер(Формат); + МенеджерПараметровРодитель.ДобавитьПровайдерПараметров( + КлассПровайдера, Приоритет, ИдентификаторФизический + ); + Провайдеры.Вставить( + Формат, + МенеджерПараметровРодитель.ПровайдерПоИдентификатору(ИдентификаторФизический) + ); + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" index d7c4726..8d238cc 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\265\320\273\320\272\320\260.os" @@ -369,33 +369,7 @@ Процедура ИнициализироватьМенеджерПараметров(СоветДругогоМастера) - МенеджерПараметров = Новый МенеджерПараметров(); - - // TODO: Добавить провайдер аргументов командной строки - ПровайдерПараметровINI = Новый ПровайдерПараметровINI(); - ПровайдерПараметровENV = Новый ПровайдерПараметровENV( - СоветДругогоМастера.ПрефиксПеременныхСреды() - ); - ПровайдерПараметровСоответствие = Новый ПровайдерПараметровСоответствие( - СоветДругогоМастера.ЗначенияДеталек() - ); - - МенеджерПараметров.ДобавитьПровайдерПараметров(ПровайдерПараметровENV, 1); - МенеджерПараметров.ИспользоватьПровайдерJSON(2); - МенеджерПараметров.ИспользоватьПровайдерYAML(2); - МенеджерПараметров.ДобавитьПровайдерПараметров(ПровайдерПараметровINI, 2); - МенеджерПараметров.ДобавитьПровайдерПараметров(ПровайдерПараметровСоответствие, 3); - - НастройкаФайловогоПровайдера = МенеджерПараметров.НастройкаПоискаФайла(); - - НастройкаФайловогоПровайдера.УстановитьСтандартныеКаталогиПоиска( - СоветДругогоМастера.ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек() - ); - - НастройкаФайловогоПровайдера.УстановитьИмяФайла( - СоветДругогоМастера.ИмяФайлаСоЗначениямиДеталек() - ); - + МенеджерПараметров = СоветДругогоМастера.ПолучитьСтроительМенеджераПараметров(); МенеджерПараметров.Прочитать(); КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" index a80b7b1..ce45dcd 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" @@ -1,3 +1,6 @@ +#Использовать "../internal" +#Использовать logos + #Область ОписаниеПеременных // Соответствие - Значения деталек в виде соответствия @@ -17,22 +20,92 @@ // Перем ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек; +// Соответствие: имя поля -> Истина, если поле явно установлено через сеттер. +// Используется для условного применения настроек к строителю. +// +Перем _Установлено; + +// СтроительМенеджераПараметров - закэшированный экземпляр строителя. +// Создаётся лениво при первом обращении к ПолучитьСтроительМенеджераПараметров() +// и переиспользуется при повторных вызовах, чтобы пользовательские правки строителя +// (через ОчиститьПровайдеры/ДобавитьПровайдер*/УдалитьПровайдер) дошли до Поделки. +// +Перем _Строитель; + +Перем Лог; + #КонецОбласти #Область ПрограммныйИнтерфейс -// Установить/получить значения деталек. +// Возвращает строитель менеджера параметров с применёнными значениями +// устаревших полей совета, явно установленных через сеттеры +// (ЗначенияДеталек, ПрефиксПеременныхСреды, ИмяФайлаСоЗначениямиДеталек, +// ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек). +// +// Если поле не было явно установлено, дефолт строителя сохраняется. +// +// Строитель кэшируется при первом вызове и возвращается тем же экземпляром +// при последующих вызовах. Это позволяет внешнему коду получить строитель, +// сконфигурировать его (добавить/удалить провайдеры, очистить состав) +// и затем передать СоветДругогоМастера в Поделку - Поделка получит тот же +// строитель со всеми внесёнными правками. // -// Параметры: -// НовоеЗначение - Соответствие - устанавливаемые значения деталек. +// Возвращаемое значение: +// СтроительМенеджераПараметров +// +Функция ПолучитьСтроительМенеджераПараметров() Экспорт + + Если _Строитель <> Неопределено Тогда + Возврат _Строитель; + КонецЕсли; + + Строитель = Новый СтроительМенеджераПараметров(); + + Если Установлено("ПрефиксПеременныхСреды") Тогда + Строитель.Провайдер("env").Настройки().УстановитьПрефикс(ПрефиксПеременныхСреды); + КонецЕсли; + + Если Установлено("ИмяФайлаСоЗначениямиДеталек") + Или Установлено("ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек") Тогда + + Метапровайдер = Строитель.ПровайдерФайлов("default"); + + Если Установлено("ИмяФайлаСоЗначениямиДеталек") Тогда + Метапровайдер.УстановитьИмяФайла(ИмяФайлаСоЗначениямиДеталек); + КонецЕсли; + + Если Установлено("ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек") Тогда + Метапровайдер.УстановитьСтандартныеКаталогиПоиска( + ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек + ); + КонецЕсли; + + КонецЕсли; + + Если Установлено("ЗначенияДеталек") Тогда + Строитель.ДобавитьПровайдерСоответствие(ЗначенияДеталек, 3, "inline"); + КонецЕсли; + + _Строитель = Строитель; + Возврат _Строитель; + +КонецФункции + +// Устарела. +// Установить/получить значения деталек. // -// Возвращаемое значение: -// Соответствие, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. +// Устаревшее API. Рекомендуется использовать +// ПолучитьСтроительМенеджераПараметров().ДобавитьПровайдерСоответствие(...). // Функция ЗначенияДеталек(НовоеЗначение = Неопределено) Экспорт Если НовоеЗначение <> Неопределено Тогда + ПредупредитьОбУстаревшемМетоде( + "ЗначенияДеталек", "ДобавитьПровайдерСоответствие(...)" + ); ЗначенияДеталек = НовоеЗначение; + ОтметитьУстановленным("ЗначенияДеталек"); Возврат ЭтотОбъект; КонецЕсли; @@ -40,37 +113,41 @@ КонецФункции +// Устарела. // Установить/получить префикс переменных среды, хранящих значения деталек. // -// Параметры: -// НовоеЗначение - Строка - устанавливаемый префикс переменных среды. -// -// Возвращаемое значение: -// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. +// Устаревшее API. Рекомендуется использовать +// ПолучитьСтроительМенеджераПараметров().Провайдер("env").Настройки().УстановитьПрефикс(...). // Функция ПрефиксПеременныхСреды(НовоеЗначение = Неопределено) Экспорт - + Если НовоеЗначение <> Неопределено Тогда + ПредупредитьОбУстаревшемМетоде( + "ПрефиксПеременныхСреды", "Провайдер(""env"").Настройки().УстановитьПрефикс(...)" + ); ПрефиксПеременныхСреды = НовоеЗначение; + ОтметитьУстановленным("ПрефиксПеременныхСреды"); Возврат ЭтотОбъект; КонецЕсли; - + Возврат ПрефиксПеременныхСреды; КонецФункции +// Устарела. // Установить/получить имя файла (без расширения), в котором хранятся значения деталек. // -// Параметры: -// НовоеЗначение - Строка - устанавливаемое имя файла. -// -// Возвращаемое значение: -// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. +// Устаревшее API. Рекомендуется использовать +// ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьИмяФайла(...). // Функция ИмяФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт Если НовоеЗначение <> Неопределено Тогда + ПредупредитьОбУстаревшемМетоде( + "ИмяФайлаСоЗначениямиДеталек", "ПровайдерФайлов(""default"").УстановитьИмяФайла(...)" + ); ИмяФайлаСоЗначениямиДеталек = НовоеЗначение; + ОтметитьУстановленным("ИмяФайлаСоЗначениямиДеталек"); Возврат ЭтотОбъект; КонецЕсли; @@ -78,18 +155,21 @@ КонецФункции +// Устарела. // Установить/получить относительный путь к каталогу, где хранятся файл со значениями деталек. // -// Параметры: -// НовоеЗначение - Строка - устанавливаемый путь к каталогу. -// -// Возвращаемое значение: -// Строка, СоветДругогоМастера - Текущее установленное значение для гетера, ЭтотОбъект для сеттера. +// Устаревшее API. Рекомендуется использовать +// ПолучитьСтроительМенеджераПараметров().ПровайдерФайлов("default").УстановитьСтандартныеКаталогиПоиска(...). // Функция ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек(НовоеЗначение = Неопределено) Экспорт Если НовоеЗначение <> Неопределено Тогда + ПредупредитьОбУстаревшемМетоде( + "ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек", + "ПровайдерФайлов(""default"").УстановитьСтандартныеКаталогиПоиска(...)" + ); ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек = НовоеЗначение; + ОтметитьУстановленным("ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек"); Возврат ЭтотОбъект; КонецЕсли; @@ -99,6 +179,24 @@ #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +Процедура ПредупредитьОбУстаревшемМетоде(Знач ИмяМетода, Знач РекомендуемаяЗамена) + + Лог.Предупреждение("Метод СоветДругогоМастера.%1(...) устарел. Используйте ПолучитьСтроительМенеджераПараметров().%2, настроив строитель до передачи СоветДругогоМастера в Поделку.", ИмяМетода, РекомендуемаяЗамена); + +КонецПроцедуры + +Процедура ОтметитьУстановленным(Знач ИмяПоля) + _Установлено.Вставить(ИмяПоля, Истина); +КонецПроцедуры + +Функция Установлено(Знач ИмяПоля) + Возврат _Установлено.Получить(ИмяПоля) = Истина; +КонецФункции + +#КонецОбласти + #Область Инициализация // Советы по созданию поделки, упакованные в объект. @@ -110,6 +208,10 @@ ИмяФайлаСоЗначениямиДеталек = "autumn-properties"; ДополнительныйКаталогПоискаФайлаСоЗначениямиДеталек = "src"; + _Установлено = Новый Соответствие; + + Лог = Логирование.ПолучитьЛог("oscript.lib.autumn.application.context"); + КонецПроцедуры #КонецОбласти diff --git "a/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" "b/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" index 7f61afa..294a566 100644 --- "a/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" +++ "b/tests/\320\241\320\276\320\262\320\265\321\202\320\224\321\200\321\203\320\263\320\276\320\263\320\276\320\234\320\260\321\201\321\202\320\265\321\200\320\260.os" @@ -177,4 +177,94 @@ КонецПроцедуры +&Тест +Процедура ПрименитьУстаревшиеНастройкиПрефиксENV() Экспорт + + // Дано + Совет = Новый СоветДругогоМастера(); + Совет.ПрефиксПеременныхСреды("MYAPP"); + + // Когда + Строитель = Совет.ПолучитьСтроительМенеджераПараметров(); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("env").Настройки().ПолучитьПрефикс()) + .Равно("MYAPP"); + +КонецПроцедуры + +&Тест +Процедура ПрименитьУстаревшиеНастройкиИмяФайла() Экспорт + + // Дано + Совет = Новый СоветДругогоМастера(); + Совет.ИмяФайлаСоЗначениямиДеталек("my-config"); + + // Когда + Строитель = Совет.ПолучитьСтроительМенеджераПараметров(); + + // Тогда + НастройкиJSON = Строитель.Провайдер("default-json").Настройки().ПолучитьНастройки(); + Ожидаем.Что(НастройкиJSON.НаименованияФайлаПараметров.Найти("my-config")) + .Не_().Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ПрименитьУстаревшиеНастройкиЗначенияДеталек() Экспорт + + // Дано + Совет = Новый СоветДругогоМастера(); + Значения = Новый Соответствие; + Значения.Вставить("ключ", "значение"); + Совет.ЗначенияДеталек(Значения); + + // Когда + Строитель = Совет.ПолучитьСтроительМенеджераПараметров(); + + // Тогда + Строитель.Прочитать(); + Ожидаем.Что(Строитель.Параметр("ключ")).Равно("значение"); + +КонецПроцедуры + +&Тест +Процедура СтроительКэшируетсяИВозвращаетсяТемЖеЭкземпляром() Экспорт + + // Дано + Совет = Новый СоветДругогоМастера(); + + // Когда + ПервыйСтроитель = Совет.ПолучитьСтроительМенеджераПараметров(); + ВторойСтроитель = Совет.ПолучитьСтроительМенеджераПараметров(); + + // Тогда + Ожидаем.Что(ВторойСтроитель).Равно(ПервыйСтроитель); + +КонецПроцедуры + +&Тест +Процедура ПравкиСтроителяВидныПриПовторномПолучении() Экспорт + + // Дано + Совет = Новый СоветДругогоМастера(); + Строитель = Совет.ПолучитьСтроительМенеджераПараметров(); + + // Когда + Строитель.ОчиститьПровайдеры(); + Значения = Новый Соответствие; + Значения.Вставить("ключ", "из-кэша"); + Строитель.ДобавитьПровайдерСоответствие(Значения, 1, "только-inline"); + + СтроительИзПоделки = Совет.ПолучитьСтроительМенеджераПараметров(); + + // Тогда + Ожидаем.Что(СтроительИзПоделки.Провайдер("env")).Равно(Неопределено); + Ожидаем.Что(СтроительИзПоделки.Провайдер("только-inline")).Не_().Равно(Неопределено); + + СтроительИзПоделки.Прочитать(); + Ожидаем.Что(СтроительИзПоделки.Параметр("ключ")).Равно("из-кэша"); + +КонецПроцедуры + Рефлектор = Новый Рефлектор(); diff --git "a/tests/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/tests/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" new file mode 100644 index 0000000..c612b5c --- /dev/null +++ "b/tests/\320\241\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\260\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -0,0 +1,299 @@ +#Использовать asserts +#Использовать configor +#Использовать ".." + +// BSLLS-off: DuplicateStringLiteral, MagicNumber + +&Тест +Процедура ДефолтныйСоставПровайдеровСоздан() Экспорт + + // Когда + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("env")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("env").Приоритет).Равно(1); + + Ожидаем.Что(Строитель.ПровайдерФайлов("default")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("default-yaml")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("default-yaml").Приоритет).Равно(2); + Ожидаем.Что(Строитель.Провайдер("default-json")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("default-ini")).Не_().Равно(Неопределено); + + +КонецПроцедуры + +&Тест +Процедура МенеджерПараметровДоступенИЕдинственный() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + ДобавитьЗначения = Новый Соответствие; + ДобавитьЗначения.Вставить("проверка", "OK"); + Строитель.ДобавитьПровайдерСоответствие(ДобавитьЗначения, 10, "check-inline"); + + // Когда + Строитель.Прочитать(); + + // Тогда + Ожидаем.Что(Строитель.Параметр("проверка")).Равно("OK"); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерРегистрируетПроизвольныйПровайдер() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Строитель.ДобавитьПровайдер(Новый ПровайдерПараметровСоответствие, 5, "extra"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("extra")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("extra").Приоритет).Равно(5); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерСоответствиеРегистрируетInlineПровайдер() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Значения = Новый Соответствие; + Значения.Вставить("ключ", "значение"); + + // Когда + Строитель.ДобавитьПровайдерСоответствие(Значения, 5, "my-inline"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("my-inline")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("my-inline").Приоритет).Равно(5); + Строитель.Прочитать(); + Ожидаем.Что(Строитель.Параметр("ключ")).Равно("значение"); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерENVРегистрируетENVПровайдер() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Строитель.ДобавитьПровайдерENV("MYAPP_", 5, "my-env"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("my-env")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("my-env").Настройки().ПолучитьПрефикс()).Равно("MYAPP_"); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерФайловРегистрируетТриФизическихПровайдера() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Метапровайдер = Строитель.ДобавитьПровайдерФайлов("custom", 7); + + // Тогда + Ожидаем.Что(Метапровайдер.Идентификатор()).Равно("custom"); + Ожидаем.Что(Строитель.Провайдер("custom-yaml").Приоритет).Равно(7); + Ожидаем.Что(Строитель.Провайдер("custom-json").Приоритет).Равно(7); + Ожидаем.Что(Строитель.Провайдер("custom-ini").Приоритет).Равно(7); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерФайловСНестандартнымНаборомФорматов() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Метапровайдер = Строитель.ДобавитьПровайдерФайлов("only", 4, "yaml json"); + + // Тогда + Ожидаем.Что(Метапровайдер.Форматы().Количество()).Равно(2); + Ожидаем.Что(Строитель.Провайдер("only-yaml")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("only-json")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("only-ini")).Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерФайлНастроекОпределяетФорматПоРасширению() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.yaml", 1, "y"); + Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.json", 1, "j"); + Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.ini", 1, "i"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("y")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("j")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("i")).Не_().Равно(Неопределено); + + НастройкиY = Строитель.Провайдер("y").Настройки().ПолучитьНастройки(); + Ожидаем.Что(НастройкиY.ПутьКФайлуПараметров).Равно("/path/to/settings.yaml"); + +КонецПроцедуры + +&Тест +Процедура ДобавитьПровайдерФайлНастроекНеподдерживаемыйФорматБросаетИсключение() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Тогда + Попытка + Строитель.ДобавитьПровайдерФайлНастроек("/path/to/settings.txt", 1, "x"); + Ожидаем.Что(Истина, "Ожидалось исключение").Равно(Ложь); + Исключение + Сообщение = ОписаниеОшибки(); + Ожидаем.Что(СтрНайти(Сообщение, "Не удалось определить формат")).Не_().Равно(0); + КонецПопытки; + +КонецПроцедуры + +&Тест +Процедура УдалитьПровайдерОтключаетПровайдер() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Строитель.ДобавитьПровайдерСоответствие(Новый Соответствие, 5, "my-inline"); + + // Когда + Строитель.УдалитьПровайдер("my-inline"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("my-inline").Включен).Равно(Ложь); + +КонецПроцедуры + +&Тест +Процедура УдалитьПровайдерФайловОтключаетВсеФизическиеПровайдеры() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Строитель.УдалитьПровайдер("default"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("default-yaml").Включен).Равно(Ложь); + Ожидаем.Что(Строитель.Провайдер("default-json").Включен).Равно(Ложь); + Ожидаем.Что(Строитель.Провайдер("default-ini").Включен).Равно(Ложь); + +КонецПроцедуры + +&Тест +Процедура ОчиститьПровайдерыСбрасываетВсеПровайдеры() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + + // Когда + Строитель.ОчиститьПровайдеры(); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("env")).Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("default-yaml")).Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура ОчиститьПровайдерыПозволяетПереиспользоватьИдентификаторыБезКоллизий() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Строитель.ОчиститьПровайдеры(); + + // Когда + Строитель.ДобавитьПровайдерENV("X_", 1, "env"); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("env")).Не_().Равно(Неопределено); + Ожидаем.Что(Строитель.Провайдер("env#2")).Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура УстановитьИмяФайлаПрименяетсяКоВсемФизическимПровайдерам() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Метапровайдер = Строитель.ПровайдерФайлов("default"); + + // Когда + Метапровайдер.УстановитьИмяФайла("custom-config"); + + // Тогда + НастройкиYAML = Строитель.Провайдер("default-yaml").Настройки().ПолучитьНастройки(); + НастройкиJSON = Строитель.Провайдер("default-json").Настройки().ПолучитьНастройки(); + НастройкиINI = Строитель.Провайдер("default-ini").Настройки().ПолучитьНастройки(); + + Ожидаем.Что(НастройкиYAML.НаименованияФайлаПараметров.Найти("custom-config")) + .Не_().Равно(Неопределено); + Ожидаем.Что(НастройкиJSON.НаименованияФайлаПараметров.Найти("custom-config")) + .Не_().Равно(Неопределено); + Ожидаем.Что(НастройкиINI.НаименованияФайлаПараметров.Найти("custom-config")) + .Не_().Равно(Неопределено); + +КонецПроцедуры + +&Тест +Процедура УстановитьПриоритетМетапровайдераМеняетПриоритетВсехФизических() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Метапровайдер = Строитель.ПровайдерФайлов("default"); + + // Когда + Метапровайдер.УстановитьПриоритет(99); + + // Тогда + Ожидаем.Что(Строитель.Провайдер("default-yaml").Приоритет).Равно(99); + Ожидаем.Что(Строитель.Провайдер("default-json").Приоритет).Равно(99); + Ожидаем.Что(Строитель.Провайдер("default-ini").Приоритет).Равно(99); + +КонецПроцедуры + +&Тест +Процедура УстановитьФайлПараметровЗапрещёнДляМультиформатногоМетапровайдера() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Метапровайдер = Строитель.ПровайдерФайлов("default"); // yaml + json + ini + + // Когда / Тогда + Попытка + Метапровайдер.УстановитьФайлПараметров("/path/to/settings.yaml"); + Ожидаем.Что(Истина, "Ожидалось исключение").Равно(Ложь); + Исключение + Сообщение = ОписаниеОшибки(); + Ожидаем.Что(СтрНайти(Сообщение, "УстановитьФайлПараметров неприменим")).Не_().Равно(0); + КонецПопытки; + +КонецПроцедуры + +&Тест +Процедура УстановитьФайлПараметровРаботаетДляОдноформатногоМетапровайдера() Экспорт + + // Дано + Строитель = (Новый СоветДругогоМастера()).ПолучитьСтроительМенеджераПараметров(); + Метапровайдер = Строитель.ДобавитьПровайдерФайлов("only-yaml-meta", 7, "yaml"); + + // Когда + Метапровайдер.УстановитьФайлПараметров("/path/to/settings.yaml"); + + // Тогда + Настройки = Строитель.Провайдер("only-yaml-meta-yaml").Настройки().ПолучитьНастройки(); + Ожидаем.Что(Настройки.ПутьКФайлуПараметров).Равно("/path/to/settings.yaml"); + +КонецПроцедуры