diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6a2bea3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+*.xml
+*.ospx
+
+
+coverage/*
+
+.vscode/*
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 527ceb9..f7246db 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,29 @@
sudo: required
+language: generic
notifications:
email: false
env:
global:
- CHANNEL=dev
+ - PACKAGE_NAME=configor
+ matrix:
+ - OSCRIPT_VERSION=1_0_19
+ - OSCRIPT_VERSION=1_0_20
+ - OSCRIPT_VERSION=night-build
+matrix:
+ allow_failures:
+ - env: OSCRIPT_VERSION=night-build
services:
- docker
+addons:
+ sonarqube: true
+
+jdk:
+ - oraclejdk8
+
before_install:
# Load cached docker images
- if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi
@@ -22,6 +37,14 @@ before_cache:
install:
- docker pull evilbeaver/onescript:1.0.19
+script:
+ - docker version
+ - docker run -it -e OSCRIPT_VERSION=$OSCRIPT_VERSION -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; sh /work_dir/travis-ci.sh; exit' | tee /tmp/test.log
+ - grep 'Результат прогона тестов <Да>' /tmp/test.log
+after_success:
+ - bash <(curl -s https://codecov.io/bash) -f coverage/coverage.json
+ - ./sonar-qube.sh
+
cache:
directories:
- '$HOME/.m2/repository'
@@ -29,14 +52,6 @@ cache:
- '$HOME/docker'
jobs:
include:
- - stage: Тестирование
- script:
- - docker version
- - docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; sh /work_dir/travis-ci.sh; exit' | tee /tmp/test.log
- - grep 'Результат прогона тестов <Да>' /tmp/test.log
- after_success:
- - bash <(curl -s https://codecov.io/bash)
-
- stage: Сборка и публикация github & hub.oscript.io
script: skip
before_deploy:
@@ -45,19 +60,19 @@ jobs:
- provider: releases
api_key: "$GITHUB_OAUTH_TOKEN"
file_glob: true
- file: configor*.ospx
+ file: $PACKAGE_NAME*.ospx
skip_cleanup: true
on:
branch: master
tags: true
- provider: script
skip_cleanup: true
- script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel dev --file ./configor-*.ospx; exit'
+ script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel dev --file ./$PACKAGE_NAME-*.ospx; exit'
on:
branch: develop
- provider: script
skip_cleanup: true
- script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel stable --file ./configor-*.ospx; exit'
+ script: docker run -it -v $(pwd):/work_dir evilbeaver/onescript:1.0.19 sh -c 'cd /work_dir; opm push --token $GITHUB_OAUTH_TOKEN --channel stable --file ./$PACKAGE_NAME-*.ospx; exit'
on:
branch: master
tags: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..5365c7e
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,37 @@
+### 0.5.0
+
+#### Новое
+* #7 Реализован конструктор параметров
+* Документация по библиотеки
+* Добавлены зависимости от `reflector`
+
+#### Исправления
+* Исправление замечаний Sonar
+
+#### Изменения API
+* Убран модуль `РаботаСПраметрами`
+
+### 0.2.1
+
+#### Новое
+* Запуск тестирования на travis-ci
+* Увеличение требований к oscript. Минимальная 1.0.19
+
+#### Исправления
+* Исправление подключения к библиотеки
+
+### 0.2.0
+
+#### Новое
+Разработана основная функиональность.
+Классы:
+- МенеджерПарамтров
+- РаботаСПраметрами
+
+Провайдеры настроек:
+- json
+- yaml (заглушка)
+
+Возможность задать своего провайдера настроек
+
+п.с. Версия содержит ошибку, не импортируется как библиотека. Используйте версию 0.2.1
diff --git a/README.md b/README.md
index 2ada86a..77f6cb8 100644
--- a/README.md
+++ b/README.md
@@ -5,39 +5,44 @@
[![Открытый чат проекта https://gitter.im/EvilBeaver/oscript-library](https://badges.gitter.im/khorevaa/configor.png)](https://gitter.im/EvilBeaver/oscript-library)
[![Build Status](https://travis-ci.org/khorevaa/configor.svg?branch=master)](https://travis-ci.org/khorevaa/configor)
-[![Coverage Status](https://coveralls.io/repos/github/khorevaa/configor/badge.svg?branch=master)](https://coveralls.io/github/khorevaa/configor?branch=master)
+[![Coverage Status](https://sonar.silverbulleters.org/api/badges/measure?key=opensource-configor&metric=coverage&blinking=true)](https://coveralls.io/github/khorevaa/configor?branch=master)
# Библиотека для работы с конфигурационными файлами в формате json, yaml
Данная библиотека позволяет работать с конфигурационными файлами с помощью предварительного описания требуемой конфигурации.
-А так же без опписания. Получение параметров по ключам вида `Настройки.Глобальные.НастройкиПрокси.Сервер`.
+А так же без описания. Получение параметров по ключам вида `Настройки.Глобальные.НастройкиПрокси.Сервер`.
Обеспечивает подстановку значение друг в друга и чтение вложенных файлов настроек
## Мотивация
Сравнительная таблица
-Библиотека [ReadParams](https://github.com/Stepa86/ReadParams)
-библиотека [Params](https://github.com/artbear/params)
-
-| | *Configor* | ReadParams | Params |
-|--------------------------------------------------------------------------------------------------------------------------------------|------------------|------------|--------|
-| Чтение файлов в формате json | ✓ | ✓ | ✓ |
-| Чтение файлов в формате yaml/yml | ✓ (в разработке) | | |
-| Чтение файлов в произвольном формате (свой класс чтения) | ✓ | | |
-| Выполнение подстановок при чтении | ✓ | ✓ | ✓ |
-| Чтение переменных окружения | | ✓ | ✓ |
-| Чтение параметров командной строки | | ✓ | ✓ |
-| Запись параметров в прочитанный файл | ✓ (в разработке) | | |
-| Выгрузка результата чтения в класс параметров | ✓ | | |
-| Поддержка деревовидных структур параметров `Настройки.Глобальные.Пользователь` и `Настройки.Локальные.Пользователь` разные параметры | ✓ | | |
-| Доступ к вложенным параметра в формате `Настройки.Глобальные` | ✓ | | |
+Библиотека от @Stepa86 [ReadParams](https://github.com/Stepa86/ReadParams)
+
+Библиотека от @artbear [Params](https://github.com/artbear/params)
+
+
+| | *Configor* | ReadParams | Params |
+|------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------|------------|--------|
+| Чтение файлов в формате json | ✓ | ✓ | ✓ |
+| Чтение файлов в формате yaml/yml | ✓ | | |
+| Чтение файлов в произвольном формате (свой провайдер чтения) | ✓ | | |
+| Выполнение подстановок при чтении | ✓ | ✓ | ✓ |
+| Чтение переменных окружения | (через произвольный провайдер) | ✓ | ✓ |
+| Чтение параметров командной строки | (через произвольный провайдер) | | ✓ |
+| Запись параметров в прочитанный файл | (в разработке) | | |
+| Встроенный конструктор параметров | ✓ | | |
+| Выгрузка результата чтения в класс параметров | ✓ | | |
+| Поддержка деревовидных структур параметров `Настройки.НастройкиПрокси.Пользователь` и `Настройки.НастройкиПрокси.Сервара.0.АдресСервера` | ✓ | | |
+| Доступ к вложенным параметра (в том числе к элементам массива) в формате `ДополнительныеХабы.0.Сервер, ДополнительныеХабы.1.Сервер` | ✓ | | |
+| Авто приоритеты - настройки в коде, в файле, в окруж., ком.строке | ✓ (на уровне приоритетов провайдеров) | | ✓ |
+| Безопасный доступ к параметрам (возвращает значение по умолчанию или неопределенно) | ✓ | ✓ | ✓ |
## Пример работы:
* Чтение параметров из файла
```bsl
-
+
// Пример файла настроек
//{
// 'Настройки': {
@@ -47,10 +52,10 @@
// "Порт": "8080"
// }
// }
- //
+ //
// }
//}
-
+
МенеджерПараметров = Новый МенеджерПараметров();
МенеджерПараметров.УстановитьФайлПараметров("Путь/К/Файлу");
МенеджерПараметров.Прочитать();
@@ -61,36 +66,50 @@
```
-* Создание объекта через модуль "РаботаСПараметрами"
-```bsl
-
- МенеджерПараметров = РаботаСПараметрами.НовыйМенеджерПараметров("config", "./configs/", "json")
- МенеджерПараметров.Прочитать();
-
- ПроксиСервер = МенеджерПараметров.Параметр("Настройки.Глобальные.НастройкиПрокси.Сервер")
+* Чтения параметров через конструктор параметров
- Сообщить(ПроксиСервер);
+Класс "ПараметрыПриложения"
+```bsl
+Перем мПараметры;
+
+Функция Параметры() Экспорт
+ Возврат мПараметры;
+КонецФункции
+
+Процедура УстановитьПараметры(Знач ВходящиеПараметры) Экспорт
+ мПараметры = ВходящиеПараметры;
+КонецПроцедуры
+
+Процедура ОписаниеПараметров(Знач Конструктор) Экспорт
+
+ НастройкиПрокси = Конструктор.НовыеПараметры("ПараметрСоответствиеСтруктуры")
+ .ПолеСтрока("Сервер")
+ .ПолеСтрока("Порт")
+ ;
+
+
+ Настройки = Конструктор.НовыеПараметры("Настройки")
+ .ПолеОбъект("НастройкиПрокси", НастройкиПрокси)
+ ;
+
+ Конструктор.ПолеСтрока("Версия version")
+ .ПолеОбъект("Настройки settings", Настройки)
+ ;
+
+КонецПроцедуры
```
-* Выгрузка результата чтения параметров в специальный класс
```bsl
- // Класс/модуль <ПараметрыПриложения> реализует следующие методы:
- // Обязательные:
- // Функция ПолучитьПараметры() - возвращает Структуру
- // Процедура УстановитьПараметры(Параметры) - Устанавливает структуру
- //
- // Необязательные:
- // Процедура ПриУстановкиЗначенияПараметра(ПолныйПутьКлюча, ИмяКлюча, Значение, СтандартнаяОбработка)
-
- МенеджерПараметров = РаботаСПараметрами.НовыйМенеджерПараметров("config", "./configs/", "json", ПараметрыПриложения)
+
+ МенеджерПараметров = Новы йМенеджерПараметров()
+ МенеджерПараметров.КонструкторПараметров(ПараметрыПриложения);
МенеджерПараметров.Прочитать();
- ПроксиСервер = МенеджерПараметров.Параметр("Настройки.Глобальные.НастройкиПрокси.Сервер")
-
- ПроксиСерверИзПараметровПриложения = ПараметрыПриложения.ПолучитьПараметры().Настройки.Глобальные.НастройкиПрокси.Сервер;
-
- Сообщить(ПроксиСервер);
+ ПроксиСервер = МенеджерПараметров.Параметр("Настройки.НастройкиПрокси.Сервер")
+
+ ПроксиСерверИзПараметровПриложения = ПараметрыПриложения.Параметры().Настройки.НастройкиПрокси.Сервер;
+
Сообщить(ПроксиСерверИзПараметровПриложения);
```
@@ -124,4 +143,4 @@ opm install configor
## Лицензия
-Смотри файл `LICENSE`.
\ No newline at end of file
+Смотри файл `LICENSE`.
diff --git a/VERSION b/VERSION
deleted file mode 100644
index 7dff5b8..0000000
--- a/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-0.2.1
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
index 885e1a6..6e8de36 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,180 +1,561 @@
Описание публичного интерфейса библиотеки
==============================
-
+
-- [Модуль РаботаСПараметрами:](#модуль-работаспараметрами)
- - [НовыйМенеджерПараметров](#новыйменеджерпараметров)
- - [УстановитьПрефиксКлючаДляЧтенияВложенногоФайлаНастроек](#установитьпрефиксключадлячтениявложенногофайланастроек)
- [Класс МенеджерПараметров:](#класс-менеджерпараметров)
- [Параметр](#параметр)
- [ЧтениеВыполнено](#чтениевыполнено)
- [Прочитать](#прочитать)
- [УстановитьФайлПараметров](#установитьфайлпараметров)
+ - [ДобавитьПровайдерПараметров](#добавитьпровайдерпараметров)
+ - [ОтключитьПровайдер](#отключитьпровайдер)
+ - [НастройкаПоискаФайла](#настройкапоискафайла)
+ - [ИспользоватьПровайдерJSON](#использоватьпровайдерjson)
+ - [ИспользоватьПровайдерYAML](#использоватьпровайдерyaml)
+ - [АвтоНастройка](#автонастройка)
+ - [УстановитьКлассПараметров](#установитькласспараметров)
+ - [КонструкторПараметров](#конструкторпараметров)
+ - [НовыйКонструкторПараметров](#новыйконструкторпараметров)
+- [Класс КонструкторПараметров](#класс-конструкторпараметров)
+ - [НовыеПараметры](#новыепараметры)
+ - [ПолучитьНаименованиеПараметров](#получитьнаименованиепараметров)
+ - [НаименованиеУзла](#наименованиеузла)
+ - [Наименование](#наименование)
+ - [ИзКласса](#изкласса)
+ - [Скопировать](#скопировать)
+ - [Работа с полями параметров](#работа-с-полями-параметров)
+ - [ПолеМассив](#полемассив)
+ - [ПолеСтрока](#полестрока)
+ - [ПолеЧисло](#полечисло)
+ - [ПолеДата](#поледата)
+ - [ПолеБулево](#полебулево)
+ - [ПолеОбъект](#полеобъект)
+ - [Поле](#поле)
+ - [ВСтруктуру](#вструктуру)
+ - [ВСоответствие](#всоответствие)
+ - [ИзСтруктуры](#изструктуры)
+ - [ИзСоответствия](#изсоответствия)
+ - [ДобавитьСинонимыПоляВИндекс](#добавитьсинонимыполявиндекс)
+ - [Использован](#использован)
+- [Класс Настройка файлового провайдера:](#класс-настройка-файлового-провайдера)
+ - [УстановитьФайлПараметров](#установитьфайлпараметров-1)
+ - [УстановитьВложенныйКаталогПоиска](#установитьвложенныйкаталогпоиска)
+ - [ПолучитьНастройки](#получитьнастройки)
- [ДобавитьКаталогПоиска](#добавитькаталогпоиска)
+ - [ОчиститьПутиПоиска](#очиститьпутипоиска)
- [УстановитьИмяФайла](#установитьимяфайла)
- [УстановитьРасширениеФайла](#установитьрасширениефайла)
- - [УстановитьПараметрыПровайдера](#установитьпараметрыпровайдера)
- - [УстановитьПроизвольныйПровайдерПараметров](#установитьпроизвольныйпровайдерпараметров)
- - [ДобавитьПровайдерПараметров](#добавитьпровайдерпараметров)
- - [ОтключитьПровайдер](#отключитьпровайдер)
- - [ДобавитьВстроенныйПровайдер](#добавитьвстроенныйпровайдер)
- - [УстановитьКлассПриемник](#установитьклассприемник)
+ - [УстановитьСтандартныеКаталогиПоиска](#установитьстандартныекаталогипоиска)
-### Модуль РаботаСПараметрами:
-> Общий модуль для работы с параметрами
+
+### Класс МенеджерПараметров:
+> Класс обеспечивающий чтение и запись (в разработке) параметров из провайдеров параметров
-#### НовыйМенеджерПараметров
+
+#### Параметр
```bsl
-// Создает нового менеджера параметров
+// Получает и возвращает значение из индекса параметров
//
// Параметры:
-// ИмяФайлаПараметров - Строка - имя файла параметров
-// КаталогПоиск - Строка - дополнительный каталог поиска параметров
-// Провайдер - Строка - перечень провайдеров (по умолчанию "json;yaml")
-// КлассПараметров - Класс - класс приемник результат чтения параметров
-// Возвращаемое значение
-// Класс МенеджерПараметров
+// ИмяПараметра - Строка - имя параметра
+// допустимо указание пути к параметру через точку (например, "config.server.protocol")
+// ЗначениеПоУмолчанию - Произвольный - возвращаемое значение в случае отсутствия параметра после чтения
+//
+// Возвращаемое значение:
+// Строка, Число, Булево, Массив, Соответствие, Неопределено - значение параметра
//
```
-#### УстановитьПрефиксКлючаДляЧтенияВложенногоФайлаНастроек
+
+#### ЧтениеВыполнено
```bsl
-// Устанавливаетпрефикс ключа для чтения вложенных файлов
-// (по умолчанию )
+// Возвращает признак выполнения чтения параметров
+//
+// Возвращаемое значение:
+// Булево - признак выполнения чтения параметров
+//
+```
+
+
+#### Прочитать
+```bsl
+// Выполняет чтения параметров из доступных провайдеров
+//
+```
+
+
+#### УстановитьФайлПараметров
+```bsl
+// Устанавливает путь к файлу параметров
//
// Параметры:
-// НовыйПрефикс - Строка - префикс ключа для чтения вложенных файлов
+// ПутьКФайлу - Строка - полный путь к файлу параметров
//
```
-### Класс МенеджерПараметров:
-> Класс обеспечивающий чтение и запись (в разработке) параметров из провайдеров параметров
+
+#### ДобавитьПровайдерПараметров
+```bsl
+// Добавляет в таблицу провайдеров произвольный класс-провайдер
+//
+// Параметры:
+// КлассОбъект - Объект - класс провайдера или имя класса
+// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+//
+```
-#### Параметр
+
+#### ОтключитьПровайдер
```bsl
-// Устанавливает класс приемник для выгрузки результата чтения параметров
+// Отключает провайдера из таблицы провайдеров
//
// Параметры:
-// ИмяПараметра - строка - имя параметра
-// допустимо указание пути к параметру через точку (например, "config.server.protocol")
-// ЗначениеПоУмолчанию - произвольный - возвращаемое значение в случае отсутствия параметра после чтения
+// ИдентификаторПровайдера - Строка - короткий идентификатор провайдера (например, json)
+//
+```
+
+
+#### НастройкаПоискаФайла
+```bsl
+// Возвращает объект настройки поиска файлов
+//
+// Возвращаемое значение:
+// Объект.НастройкаФайловогоПровайдера - внутренний класс по настройке файловых провайдеров
+//
+```
+см. описание класса `НастройкаФайловогоПровайдера`
+
+
+#### ИспользоватьПровайдерJSON
+```bsl
+// Добавляет и включает встроенный провайдер JSON
+//
+// Параметры:
+// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 0)
+//
+```
+
+
+#### ИспользоватьПровайдерYAML
+```bsl
+// Добавляет и включает встроенный провайдер YAML
+//
+// Параметры:
+// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 0)
+//
+```
+
+
+#### АвтоНастройка
+```bsl
+// Производит автоматическую настройку провайдеров
+//
+// Параметры:
+// НаименованиеФайла - Строка - Наименование файла параметров
+// ВложенныйПодкаталог - Строка - Дополнительный каталог, для стандартных путей
+// ИдентификаторыПровайдеров - Строка - Идентификаторы встроенных параметров, по умолчанию
+//
+```
+
+
+#### УстановитьКлассПараметров
+```bsl
+// Устанавливает класс параметров для описания конструктора параметров и установки результатов чтения
+//
+// Параметры:
+// КлассОбъект - Объект - произвольный класс, реализующий ряд экспортных процедур
+//
+```
+
+
+#### КонструкторПараметров
+```bsl
+// Создает, определяет и возвращает новый внутренний конструктор параметров
+//
+// Параметры:
+// КлассОбъект - Объект - Класс объект реализующий интерфейс конструктора параметров
//
// Возвращаемое значение:
-// Произвольный - значение параметра
+// Объект.КонструкторПараметров - ссылка на новый элемент класса <КонструкторПараметров>
//
```
-#### ЧтениеВыполнено
+
+#### НовыйКонструкторПараметров
```bsl
+// Создает и возвращает новый конструктор параметров
+//
+// Параметры:
+// ИмяКонструктора - Строка - наименование конструктора параметров
+// КлассОбъект - Объект - Класс объект реализующий интерфейс конструктора параметров
//
// Возвращаемое значение:
-// булево - признак выполнения чтения параметров
+// Объект.КонструкторПараметров - ссылка на новый элемент класса <КонструкторПараметров>
//
```
-#### Прочитать
+
+### Класс КонструкторПараметров
+
+
+#### НовыеПараметры
```bsl
-// Выполняет чтения параметров из доступных провайдеров
+// Создает и возвращает новый экземпляр конструктора параметров
+//
+// Параметры:
+// НовоеНаименованиеПараметров - Строка - наименование конструктора параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на новый элемент класса <КонструкторПараметров>
//
```
-#### УстановитьФайлПараметров
+
+#### ПолучитьНаименованиеПараметров
```bsl
-// Устанавливает путь к файлу параметров
+// Возвращает текущее наименование параметров
+//
+// Возвращаемое значение:
+// Строка - текущее наименование параметров
+//
+```
+
+
+#### НаименованиеУзла
+```bsl
+// (Заготовка) Устанавливает дополнительное наименование узла параметров
//
// Параметры:
-// ПутьКФайлу - строка - полный путь к файлу параметров
+// НовоеСинонимыПараметров - Строка - дополнительное наименование параметров в файле
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
//
```
-#### ДобавитьКаталогПоиска
+
+#### Наименование
```bsl
-// Добавляет дополнительный путь к каталогу поиска файла параметров
+// Устанавливает новое наименование параметров
//
// Параметры:
-// ПутьПоискаФайлов - строка - полный путь к дополнительному каталогу для поиска файла параметров
+// НовоеНаименованиеПараметров - Строка - новое наименование текущего класса параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
//
```
-#### УстановитьИмяФайла
+
+#### ИзКласса
```bsl
-// Добавляет имя файла параметров
+// Выполняет заполнение описания параметров из произвольного объекта
//
// Параметры:
-// ИмяФайла - строка - имя файла параметров
+// КлассОбъект - Объект - произвольный класс, реализуемый интерфейс Конструктора
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
//
```
-#### УстановитьРасширениеФайла
+
+#### Скопировать
```bsl
-// Устанавливает расширение файла параметров
+// Копирует текущий конструктор параметров
//
// Параметры:
-// РасширениеФайла - строка - расширение файла параметров (например, .json/json)
+// НовоеНаименованиеПараметров - Строка - наименование конструктора в индексе параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
//
```
-#### УстановитьПараметрыПровайдера
+
+#### Работа с полями параметров
+> Поддерживает `текучий` режим
+
+##### ПолеМассив
```bsl
-// Устанавливает параметры для провайдера
+// Создает и возвращает новое поле-строка конструктора параметров
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
-// Параметры - структура - произвольная структура для передачи в провайдера
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ТипЭлемента - строка - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
//
```
-#### УстановитьПроизвольныйПровайдерПараметров
+
+##### ПолеСтрока
```bsl
-// Очищает таблицу провайдеров и устанавливает произвольный класс-провайдер
+// Создает и возвращает новое поле-строка конструктора параметров
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
-// Класс - Строка/Класс - класс провайдера или имя класса
-// Настройки - Струтура - произвольная структура передаваемая провайдеру в момент выполнения
-// Приоритет - число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - строка - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
//
```
-#### ДобавитьПровайдерПараметров
+
+##### ПолеЧисло
+
```bsl
-// Добавляет в таблицу провайдеров произвольный класс-провайдер
+// Создает и возвращает новое поле-число конструктора параметров
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
-// Класс - Строка/Класс - класс провайдера или имя класса
-// Настройки - Струтура - произвольная структура передаваемая провайдеру в момент выполнения
-// Приоритет - число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Число - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
//
```
-#### ОтключитьПровайдер
+
+##### ПолеДата
+
+```bsl
+// Создает и возвращает новое поле-дата конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Дата - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+```
+
+
+##### ПолеБулево
+
+```bsl
+// Создает и возвращает новое поле-булево конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Булево - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+```
+
+
+##### ПолеОбъект
+
+```bsl
+// Создает и возвращает новое поле-объект конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ОбъектПоля - Объект.КонструкторПараметров - ссылка на объект поле
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+```
+
+
+##### Поле
+
+```bsl
+// Создает и возвращает новое поле конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ТипПоля - ОписаниеТипов - тип создаваемого поля
+// ЗначениеПоУмолчанию - Строка, Число, Дата, Неопределено - значение по умолчанию для поля
+// ТипЭлемента - ОписаниеТипов - тип для элементов поля массив
+// ОбъектПоля - Объект.КонструкторПараметров - ссылка на объект поле
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+```
+
+
+#### ВСтруктуру
```bsl
-// Отключает и удаляет провайдера из таблицы провайдеров
+// Преобразовывает структуру параметров в структуру
+//
+// Возвращаемое значение:
+// Структура - значение параметров в структуре
+//
+```
+
+
+#### ВСоответствие
+```bsl
+// Преобразовывает структуру параметров в соответствие
+//
+// Возвращаемое значение:
+// Соответствие - значение параметров в соответствии
+//
+```
+
+
+#### ИзСтруктуры
+```bsl
+// (Заготовка) Выполняет чтение значений параметров из структуры
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
+// ВходящаяСтруктура - Структура - структура со значениями параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий объект <КонструкторПараметров>
//
```
-#### ДобавитьВстроенныйПровайдер
+
+#### ИзСоответствия
```bsl
-// Добавляет встроенный провайдер по идентификаторы и приоритету
+// Выполняет чтение значений параметров из соответствия
//
// Параметры:
-// ИмяПровайдера - строка - короткий идентификатор встроенных провайдеров (например, json)
-// Приоритет - число - Числовой приоритет выполнения провайдеры
+// ВходящиеСоответствие - Соответствия - соответствие со значениями параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий объект <КонструкторПараметров>
//
```
-#### УстановитьКлассПриемник
+
+#### ДобавитьСинонимыПоляВИндекс
```bsl
-// Устанавливает класс приемник для выгрузки результата чтения параметров
+// Добавляет синонимы поля в индекс полей
//
// Параметры:
-// КлассПараметров - Класс - произвольный класс, реализующий ряд экспортных процедур
+// ПолеПараметров - Объект.ПолеКонструктораПараметров - класс <ПолеКонструктораПараметров> для чтения синонимов
//
-```
\ No newline at end of file
+```
+
+
+#### Использован
+```bsl
+// Возвращает признак использования объекта при конвертации из соответствия
+//
+// Возвращаемое значение:
+// Булево - признак использования объекта при конвертации из соответствия
+//
+```
+
+
+### Класс Настройка файлового провайдера:
+> Класс обеспечивающий настройку для провайдеров с типом `file`
+
+
+
+#### УстановитьФайлПараметров
+```bsl
+// Устанавливает путь к файлу параметров
+//
+// Параметры:
+// ПутьКФайлу - Строка - полный путь к файлу параметров
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
+
+
+#### УстановитьВложенныйКаталогПоиска
+```bsl
+// Устанавливает дополнительную строку добавляемую к каталогам поиска
+//
+// Параметры:
+// ИмяВложенногоКаталогаПоиска - Строка - дополнительная строка, добавляемая к каталогам поиска
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
+
+
+#### ПолучитьНастройки
+```bsl
+// Возвращает структуру настроек провайдера
+//
+// Возвращаемое значение:
+// Структура - подготовленная структура настроек для файловых провайдеров
+// * ПутьКФайлуПараметров - Строка - путь к установленному файлу параметров
+// * КаталогиПоиска - Массив - массив строк, путей для поиска файла
+// * ВложенныйКаталог - Строка - дополнительный каталог в каталогах поиска
+// * НаименованияФайлаПараметров - Массив - массив строк, массив имен файлов параметров
+// * РасширенияФайлаПараметров - Массив - массив строк, массив расширений файлов параметров
+// * НаправлениеСортировки - Строка - направления обхода каталогов поиска (ВОЗР или УБЫВ)
+// * ЧитатьТолькоОдинФайл - Булево - признак чтения до первого найденного файла
+//
+```
+
+
+#### ДобавитьКаталогПоиска
+```bsl
+// Добавляет дополнительный путь к каталогу поиска файла параметров
+//
+// Параметры:
+// ПутьПоискаФайлов - Строка - полный путь к дополнительному каталогу для поиска файла параметров
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
+
+
+#### ОчиститьПутиПоиска
+```bsl
+// Выполняет очистку путей поиска
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
+
+
+#### УстановитьИмяФайла
+```bsl
+// Устанавливает имя файла параметров
+//
+// Параметры:
+// ИмяФайла - Строка - имя файла параметров
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
+
+
+#### УстановитьРасширениеФайла
+```bsl
+// Устанавливает расширение файла параметров
+//
+// Параметры:
+// РасширениеФайла - Строка - расширение файла параметров (например, .json или json)
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
+
+
+#### УстановитьСтандартныеКаталогиПоиска
+```bsl
+// Устанавливает стандартные каталоги поиска
+//
+// Параметры:
+// ВложенныйПодкаталог - Строка - дополнительная строка, добавляемая к каталогам поиска
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+```
diff --git a/features/build.feature b/features/build.feature
new file mode 100644
index 0000000..d9ad370
--- /dev/null
+++ b/features/build.feature
@@ -0,0 +1,25 @@
+# language: ru
+
+Функционал: Проверка сборки продукта
+ Как Пользователь
+ Я хочу автоматически проверять сборку моего продукта
+ Чтобы гарантировать возможность установку моего продукта у пользователей
+
+Контекст: Отключение отладки в логах
+ Допустим Я выключаю отладку лога с именем "oscript.lib.configor"
+ И Я очищаю параметры команды "opm" в контексте
+
+Сценарий: Выполнение команды без параметров
+ Когда Я добавляю параметр "build ." для команды "opm"
+ И Я выполняю команду "opm"
+ Тогда Вывод команды "opm" содержит "Сборка пакета завершена"
+ И Вывод команды "opm" не содержит "Внешнее исключение"
+ И Код возврата команды "opm" равен 0
+
+Сценарий: Сборка независимого приложения
+ Когда Я добавляю параметр "build" для команды "opm"
+ И Я добавляю параметр "." для команды "opm"
+ И Я выполняю команду "opm"
+ Тогда Вывод команды "opm" содержит "Сборка пакета завершена"
+ И Вывод команды "opm" не содержит "Внешнее исключение"
+ И Код возврата команды "opm" равен 0
\ No newline at end of file
diff --git a/features/constructor.feature b/features/constructor.feature
new file mode 100644
index 0000000..32db337
--- /dev/null
+++ b/features/constructor.feature
@@ -0,0 +1,222 @@
+# language: ru
+
+Функционал: Формирование параметров через конструктор
+ Как разработчик
+ Я хочу иметь инструмент описания параметров своего проекта для чтения из файлов
+ Чтобы предоставить возможность пользователям моего проекта задавать свои параметры в формате конструктора
+
+Контекст: Тестовый контекст
+ Когда Я создаю временный каталог и сохраняю его в контекст
+ И Я сохраняю значение временного каталога в переменной "КаталогПроекта"
+ И Я устанавливаю рабочей каталог во временный каталог
+ И Я создаю МенеджерПараметров и сохраняю его в контекст
+ И Я устанавливаю АвтоНастройки с параметрами
+ | .config |
+ | '' |
+ | json |
+ # И Я включаю отладку лога с именем "oscript.lib.configor.constructor"
+
+Сценарий: Чтение файла параметров согласно конструктору параметров из класса
+ Допустим Я подключаю тестовый класс описания параметров
+ И Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "version": "1.0",
+ "ПараметрСтрока": "ПростоСтрока",
+ "ПараметрДата": "2017-01-01T00:00:00Z",
+ "ПараметрЧисло": 10,
+ "ПараметрМассив": [
+ "Элемент1",
+ "Элемент2",
+ "Элемент3"
+ ],
+ "ПараметрСтруктура": {
+ "Строка": "ПростоСтрока",
+ "Дата": "2017-01-01T00:00:00Z",
+ "Число": 10,
+ "Массив": [
+ "Элемент1",
+ "Элемент2",
+ "Элемент3"
+ ],
+ "Структура": {
+ "Ключ1": "ЗначениеСтруктуры1",
+ "Ключ2": "ЗначениеСтруктуры2"
+ },
+ "Соответствие": {
+ "КлючВнутри1": "Значение1",
+ "КлючВнутри2": "Значение2"
+ }
+ },
+ "ПараметрСоответствие": {
+ "Ключ1": "Значение1",
+ "Ключ2": "Значение2"
+ }
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Строка параметра "version" равна "1.0"
+ И Строка параметра "ПараметрСтрока" равна "ПростоСтрока"
+ И Дата параметра "ПараметрДата" равна "20170101"
+ И Число параметра "ПараметрЧисло" равна "10"
+ И Строка параметра "ПараметрМассив.0" равна "Элемент1"
+ И Строка параметра "ПараметрМассив.1" равна "Элемент2"
+ И Строка параметра "ПараметрМассив.2" равна "Элемент3"
+ И Строка параметра "ПараметрСтруктура.Строка" равна "ПростоСтрока"
+ И Дата параметра "ПараметрСтруктура.Дата" равна "20170101"
+ И Число параметра "ПараметрСтруктура.Число" равна "10"
+ И Строка параметра "ПараметрСтруктура.Массив.0" равна "Элемент1"
+ И Строка параметра "ПараметрСтруктура.Массив.1" равна "Элемент2"
+ И Строка параметра "ПараметрСтруктура.Массив.2" равна "Элемент3"
+ И Строка параметра "ПараметрСтруктура.Структура.Ключ1" равна "ЗначениеСтруктуры1"
+ И Строка параметра "ПараметрСтруктура.Структура.Ключ2" равна "ЗначениеСтруктуры2"
+ И Строка параметра "ПараметрСтруктура.Соответствие.КлючВнутри1" равна "Значение1"
+ И Строка параметра "ПараметрСтруктура.Соответствие.КлючВнутри2" равна "Значение2"
+ И Строка параметра "ПараметрСоответствие.Ключ1" равна "Значение1"
+ И Строка параметра "ПараметрСоответствие.Ключ2" равна "Значение2"
+
+Сценарий: Конструктор полей строка, число, дата, булево
+ Допустим Я добавляю поле "ПараметрСтрока string" с типом "Строка" и значением "" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрЧисло number" с типом "Число" и значением "" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрДата datetime" с типом "Дата" и значением "" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрБулево boolean" с типом "Булево" и значением "" для параметров "МенеджерПараметров"
+ И Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "ПараметрСтрока": "ПростоСтрока",
+ "datetime": "2017-01-01T00:00:00Z",
+ "number": 10,
+ "ПараметрБулево": true
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Дата параметра "ПараметрДата" равна "20170101"
+ И Строка параметра "ПараметрСтрока" равна "ПростоСтрока"
+ И Число параметра "ПараметрЧисло" равна "10"
+ И Булево параметра "ПараметрБулево" равна "Истина"
+
+Сценарий: Конструктор полей строка, число, дата, булево со значением по умолчанию
+ Допустим Я добавляю поле "ПараметрСтрока string" с типом "Строка" и значением "Зеленая" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрЧисло number" с типом "Число" и значением "100" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрДата datetime" с типом "Дата" и значением "20050101" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрБулево boolean" с типом "Булево" и значением "Истина" для параметров "МенеджерПараметров"
+ И Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "ЛевыйПараметр": "ПростоСтрока"
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Дата параметра "ПараметрДата" равна "20050101"
+ И Строка параметра "ПараметрСтрока" равна "Зеленая"
+ И Число параметра "ПараметрЧисло" равна "100"
+ И Булево параметра "ПараметрБулево" равна "Истина"
+
+Сценарий: Конструктор вложенных параметров с полями
+ Допустим Я создаю новые параметры с именем "Глобальные globals" и сохраняю в "Глобальные"
+ И Я добавляю поле "Глобальные globals" из объекта "Глобальные" для параметров "МенеджерПараметров"
+ И Я добавляю поле "ПараметрСтрока string" с типом "Строка" и значением "Зелёная" для параметров "Глобальные"
+ И Я добавляю поле "ПараметрЧисло number" с типом "Число" и значением "9" для параметров "Глобальные"
+ И Я добавляю поле "ПараметрДата datetime" с типом "Дата" и значением "" для параметров "Глобальные"
+ И Я добавляю поле "ПараметрБулево boolean" с типом "Булево" и значением "" для параметров "Глобальные"
+ И Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "globals":
+ {
+ "string": "Красная",
+ "datetime": "2017-01-01T00:00:00Z",
+ "number": 10,
+ "boolean": "Истина"
+ }
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Дата параметра "Глобальные.ПараметрДата" равна "20170101"
+ И Строка параметра "Глобальные.ПараметрСтрока" равна "Красная"
+ И Число параметра "Глобальные.ПараметрЧисло" равна "10"
+ И Булево параметра "Глобальные.ПараметрБулево" равна "Истина"
+
+Сценарий: Конструктор полей массивов строка, число, дата, булево
+ Допустим Я добавляю поле "МассивСтрок string-array" массив с типом "Строка" для параметров "МенеджерПараметров"
+ И Я добавляю поле "МассивЧисел number-array" массив с типом "Число" для параметров "МенеджерПараметров"
+ И Я добавляю поле "МассивДат datetime-array" массив с типом "Дата" для параметров "МенеджерПараметров"
+ И Я добавляю поле "МассивБулево boolean-array" массив с типом "Булево" для параметров "МенеджерПараметров"
+ И Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "МассивСтрок":
+ [
+ "Строка1",
+ "Строка2"
+ ],
+ "МассивЧисел":
+ [
+ 1,
+ 2
+ ],
+ "МассивДат":
+ [
+ "2015-01-01T00:00:00Z",
+ "2016-01-01T00:00:00Z"
+ ],
+ "boolean-array":
+ [
+ "true",
+ "false"
+ ]
+
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Строка параметра "МассивСтрок.0" равна "Строка1"
+ И Строка параметра "МассивСтрок.1" равна "Строка2"
+ И Число параметра "МассивЧисел.0" равна "1"
+ И Число параметра "МассивЧисел.1" равна "2"
+ И Дата параметра "МассивДат.0" равна "20150101"
+ И Дата параметра "МассивДат.1" равна "20160101"
+ И Булево параметра "МассивБулево.0" равна "Истина"
+ И Булево параметра "МассивБулево.1" равна "Ложь"
+
+Сценарий: Конструктор вложенных параметров массивов с полями
+ Допустим Я создаю новые параметры с именем "Глобальные globals" и сохраняю в "Глобальные"
+ И Я добавляю поле "Глобальные globals" из объекта "Глобальные" для параметров "МенеджерПараметров"
+ И Я создаю новые параметры с именем "Сервер server" и сохраняю в "Сервер"
+ И Я добавляю поле "Наименование name" с типом "Строка" и значением "" для параметров "Сервер"
+ И Я добавляю поле "КоличествоПроцессоров cpu" с типом "Число" и значением "" для параметров "Сервер"
+ И Я добавляю поле "ДатаЗапуска start-time" с типом "Дата" и значением "" для параметров "Сервер"
+ И Я добавляю поле "СервисNFS nfs" с типом "Булево" и значением "" для параметров "Сервер"
+ И Я добавляю поле "Сервера servers" массив из объектов "Сервер" для параметров "Глобальные"
+ И Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "globals":
+ {
+ "servers":
+ [
+ {
+ "name": "Файловый сервер",
+ "start-time": "2016-01-01T00:00:00Z",
+ "cpu": 10,
+ "nfs": true
+ },
+ {
+ "name": "Сервер 1С",
+ "start-time": "2017-01-01T00:00:00Z",
+ "cpu": 5,
+ "nfs": "Ложь"
+ }
+ ]
+ }
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Строка параметра "Глобальные.Сервера.0.Наименование" равна "Файловый сервер"
+ И Строка параметра "Глобальные.Сервера.1.Наименование" равна "Сервер 1С"
+ И Число параметра "Глобальные.Сервера.0.КоличествоПроцессоров" равна "10"
+ И Число параметра "Глобальные.Сервера.1.КоличествоПроцессоров" равна "5"
+ И Дата параметра "Глобальные.Сервера.0.ДатаЗапуска" равна "20160101"
+ И Дата параметра "Глобальные.Сервера.1.ДатаЗапуска" равна "20170101"
+ И Булево параметра "Глобальные.Сервера.0.СервисNFS" равна "Истина"
+ И Булево параметра "Глобальные.Сервера.1.СервисNFS" равна "Ложь"
+
\ No newline at end of file
diff --git a/features/json-provider.feature b/features/json-provider.feature
new file mode 100644
index 0000000..3165755
--- /dev/null
+++ b/features/json-provider.feature
@@ -0,0 +1,102 @@
+# language: ru
+
+Функционал: Чтение файла параметров через провайдер json
+ Как разработчик
+ Я хочу иметь инструмент чтения параметров своего проекта из файлов json
+ Чтобы предоставить возможность пользователям моего проекта задавать настройки в формате json
+
+Контекст: Тестовый контекст
+ Когда Я создаю временный каталог и сохраняю его в контекст
+ И Я сохраняю значение временного каталога в переменной "КаталогПроекта"
+ И Я устанавливаю рабочей каталог во временный каталог
+ И Я создаю МенеджерПараметров и сохраняю его в контекст
+ И Я устанавливаю АвтоНастройки с параметрами
+ | .config |
+ | '' |
+ | json |
+
+Сценарий: Чтение файла параметров в формате json
+ Допустим Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "ИмяПроекта": "test-app",
+ "build": {
+ "binary": "test-app"
+ },
+ "releases": {
+ "repo": {
+ "name": "test",
+ "owner": "owner"
+ }
+ },
+ "changelog": {
+ "filters": {
+ "include": [
+ "^docs:",
+ "^test:",
+ "Merge pull request",
+ "Merge branch"
+ ]
+ },
+ "sort": "asc"
+ }
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Значение параметра "build.binary" равно "test-app"
+ И Значение параметра "releases.repo.name" равно "test"
+ И Значение параметра "releases.repo.owner" равно "owner"
+ И Количество значения параметра "changelog.filters.include" равно "4"
+
+Сценарий: Подстановка значене после чтения параметров в формате json
+
+ Допустим Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "ИмяПроекта": "test-app",
+ "build": {
+ "binary": "test-app"
+ },
+ "releases": {
+ "repo": {
+ "name": "test",
+ "owner": "owner"
+ }
+ },
+ "replace": "test/%releases.repo.name%"
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Значение параметра "build.binary" равно "test-app"
+ И Значение параметра "releases.repo.name" равно "test"
+ И Значение параметра "releases.repo.owner" равно "owner"
+ И Значение параметра "replace" равно "test/test"
+
+Сценарий: Чтение вложенных файлов параметров json
+
+ Допустим Я добавляю файл ".config.json" в каталог проекта с содержанием
+ """
+ {
+ "ИмяПроекта": "test-app",
+ "build": {
+ "binary": "test-app"
+ },
+ "releases": {
+ "ReadFile": ".add.json"
+ }
+ }
+ """
+ И Я добавляю файл ".add.json" в каталог проекта с содержанием
+ """
+ {
+ "repo": {
+ "name": "test",
+ "owner": "owner"
+ }
+ }
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Значение параметра "build.binary" равно "test-app"
+ И Значение параметра "releases.repo.name" равно "test"
+ И Значение параметра "releases.repo.owner" равно "owner"
+
diff --git a/features/manager.feature b/features/manager.feature
new file mode 100644
index 0000000..5640559
--- /dev/null
+++ b/features/manager.feature
@@ -0,0 +1,6 @@
+# language: ru
+
+Функционал: Формирование параметров через конструктор
+ Как разработчик
+ Я хочу иметь инструмент описания параметров своего проекта для чтения из файлов
+ Чтобы предоставить возможность пользователям моего проекта задавать свои параметры в формате конструктора
diff --git a/features/step_definitions/constructor.os b/features/step_definitions/constructor.os
new file mode 100644
index 0000000..86f3428
--- /dev/null
+++ b/features/step_definitions/constructor.os
@@ -0,0 +1,211 @@
+// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
+#Использовать asserts
+#Использовать json
+
+Перем БДД; //контекст фреймворка 1bdd
+
+// Метод выдает список шагов, реализованных в данном файле-шагов
+Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
+ БДД = КонтекстФреймворкаBDD;
+
+ ВсеШаги = Новый Массив;
+
+ ВсеШаги.Добавить("ЯПодключаюТестовыйКлассОписанияПараметров");
+ ВсеШаги.Добавить("ЗначениеПараметраКлассаРавно");
+ ВсеШаги.Добавить("ЯДобавляюПолеСТипомИЗначениемДляПараметров");
+ ВсеШаги.Добавить("ЯСоздаюНовыеПараметрыСИменемИСохраняюВ");
+ ВсеШаги.Добавить("ЯДобавляюПолеИзОбъектаДляПараметров");
+ ВсеШаги.Добавить("ЯДобавляюПолеМассивСТипомДляПараметров");
+ ВсеШаги.Добавить("ЯДобавляюПолеМассивИзОбъектовДляПараметров");
+
+ Возврат ВсеШаги;
+КонецФункции
+
+// Реализация шагов
+
+// Процедура выполняется перед запуском каждого сценария
+Процедура ПередЗапускомСценария(Знач Узел) Экспорт
+
+КонецПроцедуры
+
+// Процедура выполняется после завершения каждого сценария
+Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
+
+КонецПроцедуры
+
+//Я подключаю тестовый класс описания параметров
+Процедура ЯПодключаюТестовыйКлассОписанияПараметров() Экспорт
+
+ КлассПараметров = ПодготовитьТестовыйКласс();
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+ МенеджерПараметров.КонструкторПараметров(КлассПараметров);
+
+ БДД.СохранитьВКонтекст("КлассПараметров", КлассПараметров);
+
+КонецПроцедуры
+
+//Прочитанные параметры равны файлу ".config.yaml" в каталоге проекта
+Процедура ПрочитанныеПараметрыРавныФайлуВКаталогеПроекта(Знач ИмяФайлаПараметров) Экспорт
+
+ КаталогПроекта = БДД.ПолучитьИзКонтекста("КаталогПроекта");
+
+ Чтение = Новый ЧтениеТекста(ОбъединитьПути(КаталогПроекта, ИмяФайлаПараметров), КодировкаТекста.UTF8);
+ ТекстФайлаПараметров = Чтение.Прочитать();
+ Чтение.Закрыть();
+
+ КлассПараметров = БДД.ПолучитьИзКонтекста("КлассПараметров");
+ ПараметрыКласса = КлассПараметров.Параметры();
+
+ ПарсерJSON = Новый ПарсерJSON;
+
+ ПараметрыКласса = КлассПараметров.Параметры();
+ ТекстПроверки = ПарсерJSON.ЗаписатьJSON(ПараметрыКласса);
+
+ Утверждения.ПроверитьРавенство(ТекстФайлаПараметров, ТекстПроверки, "Результат должен совпадать с ожиданиями.");
+
+КонецПроцедуры
+
+//Значение параметра класса "releases.repo.owner" равно "owner"
+Процедура ЗначениеПараметраКлассаРавно(Знач ИмяПараметра, Знач ТребуемоеЗначениеПараметра) Экспорт
+
+ КлассПараметров = БДД.ПолучитьИзКонтекста("КлассПараметров");
+ ПараметрыКласса = КлассПараметров.Параметры();
+
+ ЗначениеПараметра = ПолучитьЗначениеКлюча(ИмяПараметра, ПараметрыКласса);
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра, ТребуемоеЗначениеПараметра, "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
+//Я добавляю поле "" с типом "Строка" и значением "" для параметров "МенеджерПараметров"
+Процедура ЯДобавляюПолеСТипомИЗначениемДляПараметров(Знач ИмяПоля, Знач ТипПоля, Знач ЗначениеПоУмолчанию, Знач ИмяКонструктораПараметров) Экспорт
+
+ ТекущийКонструкторПараметров = БДД.ПолучитьИзКонтекста(ИмяКонструктораПараметров);
+
+ Если ТипЗнч(ТекущийКонструкторПараметров) = Тип("МенеджерПараметров") Тогда
+ ТекущийКонструкторПараметров = ТекущийКонструкторПараметров.КонструкторПараметров();
+ КонецЕсли;
+
+ Если ТипПоля = "Строка" Тогда
+
+ ТекущийКонструкторПараметров.ПолеСтрока(ИмяПоля, ЗначениеПоУмолчанию);
+
+ ИначеЕсли ТипПоля = "Число" Тогда
+
+ Если ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
+ ЗначениеПоУмолчанию = Число(ЗначениеПоУмолчанию);
+ Иначе
+ ЗначениеПоУмолчанию = Неопределено;
+ КонецЕсли;
+
+ ТекущийКонструкторПараметров.ПолеЧисло(ИмяПоля, ЗначениеПоУмолчанию);
+
+ ИначеЕсли ТипПоля = "Дата" Тогда
+
+ Если ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
+ ЗначениеПоУмолчанию = Дата(ЗначениеПоУмолчанию);
+ Иначе
+ ЗначениеПоУмолчанию = Неопределено;
+ КонецЕсли;
+
+ ТекущийКонструкторПараметров.ПолеДата(ИмяПоля, ЗначениеПоУмолчанию);
+
+ ИначеЕсли ТипПоля = "Булево" Тогда
+
+ Если ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
+ ЗначениеПоУмолчанию = Булево(ЗначениеПоУмолчанию);
+ Иначе
+ ЗначениеПоУмолчанию = Ложь;
+ КонецЕсли;
+
+ ТекущийКонструкторПараметров.ПолеБулево(ИмяПоля, ЗначениеПоУмолчанию);
+
+ Иначе
+ ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <ЯСоздаюНовыеПараметрыСИменемИСохраняюВ> передан не правильный тип", "Передан не правильный тип поля.");
+ КонецЕсли;
+
+
+КонецПроцедуры
+
+//Я создаю новые параметры с именем "Глобальные globals" и сохраняю в "Глобальные"
+Процедура ЯСоздаюНовыеПараметрыСИменемИСохраняюВ(Знач ИмяКонструктораПараметров, Знач ИмяПеременной) Экспорт
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+ ПараметрОбъект = МенеджерПараметров.НовыйКонструкторПараметров(ИмяКонструктораПараметров);
+
+ БДД.СохранитьВКонтекст(ИмяПеременной, ПараметрОбъект);
+
+КонецПроцедуры
+
+//Я добавляю поле "Объект" из объекта "" для параметров "Глобальные"
+Процедура ЯДобавляюПолеИзОбъектаДляПараметров(Знач ИмяПоля, Знач ИмяПеременнойОбъекта, Знач ИмяКонструктораПараметров) Экспорт
+
+ ТекущийКонструкторПараметров = БДД.ПолучитьИзКонтекста(ИмяКонструктораПараметров);
+ ОбъектПоля = БДД.ПолучитьИзКонтекста(ИмяПеременнойОбъекта);
+
+ ТекущийКонструкторПараметров = БДД.ПолучитьИзКонтекста(ИмяКонструктораПараметров);
+
+ Если ТипЗнч(ТекущийКонструкторПараметров) = Тип("МенеджерПараметров") Тогда
+ ТекущийКонструкторПараметров = ТекущийКонструкторПараметров.КонструкторПараметров();
+ КонецЕсли;
+
+ ТекущийКонструкторПараметров.ПолеОбъект(ИмяПоля, ОбъектПоля);
+
+КонецПроцедуры
+
+//Я добавляю поле "Массив" массив с типом "Строка" для параметров "Глобальные"
+Процедура ЯДобавляюПолеМассивСТипомДляПараметров(Знач ИмяПоля, Знач ТипПоля, Знач ИмяКонструктораПараметров) Экспорт
+ Конструктор = БДД.ПолучитьИзКонтекста(ИмяКонструктораПараметров);
+ Если ТипЗнч(Конструктор) = Тип("МенеджерПараметров") Тогда
+ Конструктор = Конструктор.КонструкторПараметров();
+ КонецЕсли;
+ Конструктор.ПолеМассив(ИмяПоля, Тип(ТипПоля));
+КонецПроцедуры
+
+//Я добавляю поле "МассивОбъектов" массив из объектов "Строка" для параметров "Глобальные"
+Процедура ЯДобавляюПолеМассивИзОбъектовДляПараметров(Знач ИмяПоля, Знач ИмяПеременнойОбъекта, Знач ИмяКонструктораПараметров) Экспорт
+
+ Конструктор = БДД.ПолучитьИзКонтекста(ИмяКонструктораПараметров);
+ Если ТипЗнч(Конструктор) = Тип("МенеджерПараметров") Тогда
+ Конструктор = Конструктор.КонструкторПараметров();
+ КонецЕсли;
+ ОбъектПоля = БДД.ПолучитьИзКонтекста(ИмяПеременнойОбъекта);
+ Конструктор.ПолеМассив(ИмяПоля, ОбъектПоля);
+
+КонецПроцедуры
+
+Функция ПолучитьЗначениеКлюча(ИмяКлюча, Параметры)
+
+ МассивКлючей = СтрРазделить(ИмяКлюча, ".", Ложь);
+
+ ЗначениеКлюча = Неопределено;
+
+ ПервыйПроход = Истина;
+
+ Для каждого Ключ Из МассивКлючей Цикл
+
+ Если ПервыйПроход Тогда
+ ЗначениеКлюча = Параметры[Ключ];
+ ПервыйПроход = Ложь;
+ Иначе
+ ЗначениеКлюча = ЗначениеКлюча[Ключ];
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат ЗначениеКлюча;
+
+КонецФункции
+
+Функция КаталогFixtures()
+ Возврат ОбъединитьПути(КаталогБиблиотеки(), "tests", "fixtures");
+КонецФункции
+
+Функция КаталогБиблиотеки()
+ Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", "..");
+КонецФункции
+
+Функция ПодготовитьТестовыйКласс()
+
+ Возврат ЗагрузитьСценарий(ОбъединитьПути(КаталогFixtures(), "ТестовыйКласс.os"));
+
+КонецФункции
diff --git a/features/step_definitions/shared.os b/features/step_definitions/shared.os
new file mode 100644
index 0000000..6a22837
--- /dev/null
+++ b/features/step_definitions/shared.os
@@ -0,0 +1,144 @@
+// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
+#Использовать asserts
+#Использовать tempfiles
+
+#Использовать "../../src"
+
+Перем БДД; //контекст фреймворка 1bdd
+
+// Метод выдает список шагов, реализованных в данном файле-шагов
+Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
+ БДД = КонтекстФреймворкаBDD;
+
+ ВсеШаги = Новый Массив;
+
+ ВсеШаги.Добавить("ЯСохраняюЗначениеВременногоКаталогаВПеременной");
+ ВсеШаги.Добавить("ЯУстанавливаюРабочейКаталогВоВременныйКаталог");
+ ВсеШаги.Добавить("ЯДобавляюФайлВКаталогПроектаССодержанием");
+ ВсеШаги.Добавить("ДатаПараметраРавна");
+ ВсеШаги.Добавить("СтрокаПараметраРавна");
+ ВсеШаги.Добавить("ЧислоПараметраРавна");
+ ВсеШаги.Добавить("БулевоПараметраРавна");
+
+ Возврат ВсеШаги;
+
+КонецФункции
+
+Функция ИмяЛога() Экспорт
+ Возврат "bdd.configor.feature";
+КонецФункции
+
+
+// Реализация шагов
+
+// Процедура выполняется перед запуском каждого сценария
+Процедура ПередЗапускомСценария(Знач Узел) Экспорт
+КонецПроцедуры
+
+// Процедура выполняется после завершения каждого сценария
+Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
+ ВременныеФайлы.Удалить();
+КонецПроцедуры
+
+//Я устанавливаю рабочей каталог во временный каталог
+Процедура ЯУстанавливаюРабочейКаталогВоВременныйКаталог() Экспорт
+ УстановитьТекущийКаталог(БДД.ПолучитьИзКонтекста("ВременныйКаталог"));
+КонецПроцедуры
+
+//Я сохраняю значение временного каталога в переменной "URLРепозитория"
+Процедура ЯСохраняюЗначениеВременногоКаталогаВПеременной(Знач ИмяПеременной) Экспорт
+ ВременныйКаталог = БДД.ПолучитьИзКонтекста("ВременныйКаталог");
+ БДД.СохранитьВКонтекст(ИмяПеременной, ВременныйКаталог);
+КонецПроцедуры
+
+//Я добавляю файл ".orca.yaml" в каталог проекта с содержанием "
+//|ИмяПроекта: &app_name test-app
+//|
+//|build:
+//| binary: *app_name
+//|
+//|checksum:
+//| name_template: '{{ .ProjectName }}_checksums.txt'
+//|changelog:
+//| filters:
+//| exclude:
+//| - '^docs:'
+//| - '^test:'
+//| - Merge pull request
+//| - Merge branch
+//| sort: asc
+Процедура ЯДобавляюФайлВКаталогПроектаССодержанием(Знач ИмяФайла, Знач ТекстФайла) Экспорт
+
+ КаталогПроекта = БДД.ПолучитьИзКонтекста("КаталогПроекта");
+ ФайлНастроек = Новый ЗаписьТекста;
+ ФайлНастроек.Открыть(ОбъединитьПути(КаталогПроекта, ИмяФайла), "utf-8");
+ ФайлНастроек.ЗаписатьСтроку(ТекстФайла);
+ ФайлНастроек.Закрыть();
+
+КонецПроцедуры
+
+//Дата параметра "" равна ""
+Процедура ДатаПараметраРавна(Знач ИмяПараметра, Знач ПроверочноеЗначение) Экспорт
+
+ ПроверочнаяДата = Дата(ПроверочноеЗначение);
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+
+ ЗначениеПараметра = МенеджерПараметров.Параметр(ИмяПараметра);
+
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра, ПроверочнаяДата, "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
+//Строка параметра "" равна ""
+Процедура СтрокаПараметраРавна(Знач ИмяПараметра, Знач ПроверочноеЗначение) Экспорт
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+
+ ЗначениеПараметра = МенеджерПараметров.Параметр(ИмяПараметра);
+
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра, ПроверочноеЗначение, "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
+//Число параметра "" равна ""
+Процедура ЧислоПараметраРавна(Знач ИмяПараметра, Знач ПроверочноеЗначение) Экспорт
+
+ ПроверочноеЧисло = Число(ПроверочноеЗначение);
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+
+ ЗначениеПараметра = МенеджерПараметров.Параметр(ИмяПараметра);
+
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра, ПроверочноеЧисло, "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
+//Булево параметров "" равна ""
+Процедура БулевоПараметраРавна(Знач ИмяПараметра, Знач ПроверочноеЗначение) Экспорт
+
+ ПроверочноеБулево = Булево(ПроверочноеЗначение);
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+
+ ЗначениеПараметра = МенеджерПараметров.Параметр(ИмяПараметра);
+
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра, ПроверочноеБулево, "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
+Функция КаталогFixtures()
+ Возврат ОбъединитьПути(КаталогПриложения(), "tests", "fixtures");
+КонецФункции
+
+Функция КаталогПриложения()
+ Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", "..");
+КонецФункции
+
+Функция ОбернутьВКавычки(Знач Строка);
+ Возврат """" + Строка + """";
+КонецФункции
+
+Лог = Логирование.ПолучитьЛог(ИмяЛога());
+//Лог.УстановитьУровень(Логирование.ПолучитьЛог("bdd").Уровень());
+// Лог.УстановитьУровень(УровниЛога.Отладка);
diff --git a/features/step_definitions/yaml-provider.os b/features/step_definitions/yaml-provider.os
new file mode 100644
index 0000000..0bdbe8d
--- /dev/null
+++ b/features/step_definitions/yaml-provider.os
@@ -0,0 +1,79 @@
+// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
+#Использовать asserts
+
+Перем БДД; //контекст фреймворка 1bdd
+
+// Метод выдает список шагов, реализованных в данном файле-шагов
+Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
+ БДД = КонтекстФреймворкаBDD;
+
+ ВсеШаги = Новый Массив;
+
+ ВсеШаги.Добавить("ЯСоздаюМенеджерпараметровИСохраняюЕгоВКонтекст");
+ ВсеШаги.Добавить("ЯУстанавливаюАвтонастройкиСПараметрами");
+ ВсеШаги.Добавить("ЯВыполняюЧтениеПараметров");
+ ВсеШаги.Добавить("ЗначениеПараметраРавно");
+ ВсеШаги.Добавить("КоличествоЗначенияПараметраРавно");
+
+ Возврат ВсеШаги;
+КонецФункции
+
+// Реализация шагов
+
+// Процедура выполняется перед запуском каждого сценария
+Процедура ПередЗапускомСценария(Знач Узел) Экспорт
+
+КонецПроцедуры
+
+// Процедура выполняется после завершения каждого сценария
+Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
+
+КонецПроцедуры
+
+//Я создаю МенеджерПараметров и сохраняю его в контекст
+Процедура ЯСоздаюМенеджерПараметровИСохраняюЕгоВКонтекст() Экспорт
+
+ МенеджерПараметров = Новый МенеджерПараметров;
+ БДД.СохранитьВКонтекст("МенеджерПараметров", МенеджерПараметров);
+
+КонецПроцедуры
+
+//Я устанавливаю АвтоНастройки с параметрами
+//| config |
+//| '' |
+//| yaml |
+Процедура ЯУстанавливаюАвтонастройкиСПараметрами(Знач ТаблицаПараметров) Экспорт
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+ МенеджерПараметров.АвтоНастройка(ТаблицаПараметров[0][0], ТаблицаПараметров[1][0], ТаблицаПараметров[2][0]);
+
+КонецПроцедуры
+
+//Я выполняю чтение параметров
+Процедура ЯВыполняюЧтениеПараметров() Экспорт
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+ МенеджерПараметров.Прочитать();
+
+КонецПроцедуры
+
+//Значение параметра "build.binary" равно "test-app"
+Процедура ЗначениеПараметраРавно(Знач ИмяПараметра, Знач ТребуемоеЗначениеПараметра) Экспорт
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+
+ ЗначениеПараметра = МенеджерПараметров.Параметр(ИмяПараметра);
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра, ТребуемоеЗначениеПараметра, "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
+//Количество значения параметра "changelog.filters.include" равно "4"
+Процедура КоличествоЗначенияПараметраРавно(Знач ИмяПараметра, Знач ТребуемоеЗначениеПараметра) Экспорт
+
+ МенеджерПараметров = БДД.ПолучитьИзКонтекста("МенеджерПараметров");
+
+ ЗначениеПараметра = МенеджерПараметров.Параметр(ИмяПараметра);
+ Утверждения.ПроверитьРавенство(ЗначениеПараметра.Количество(), Число(ТребуемоеЗначениеПараметра), "Результат должен совпадать с ожиданиями");
+
+КонецПроцедуры
+
diff --git a/features/yaml-provider.feature b/features/yaml-provider.feature
new file mode 100644
index 0000000..e16b9c1
--- /dev/null
+++ b/features/yaml-provider.feature
@@ -0,0 +1,89 @@
+# language: ru
+
+Функционал: Чтение файла параметров через провайдер yaml
+ Как разработчик
+ Я хочу иметь инструмент чтения параметров своего проекта из файлов yaml
+ Чтобы предоставить возможность пользователям моего проекта задавать настройки в формате yaml
+
+Контекст: Тестовый контекст
+ Когда Я создаю временный каталог и сохраняю его в контекст
+ И Я сохраняю значение временного каталога в переменной "КаталогПроекта"
+ И Я устанавливаю рабочей каталог во временный каталог
+ И Я создаю МенеджерПараметров и сохраняю его в контекст
+ И Я устанавливаю АвтоНастройки с параметрами
+ | .config |
+ | '' |
+ | yaml |
+
+Сценарий: Чтение файла параметров в формате yaml
+ Допустим Я добавляю файл ".config.yaml" в каталог проекта с содержанием
+ """
+ ИмяПроекта: &app_name test-app
+
+ build:
+ binary: *app_name
+
+ releases:
+ repo:
+ name: test
+ owner: owner
+
+ changelog:
+ filters:
+ include:
+ - '^docs:'
+ - '^test:'
+ - Merge pull request
+ - Merge branch
+ sort: asc
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Значение параметра "build.binary" равно "test-app"
+ И Значение параметра "releases.repo.name" равно "test"
+ И Значение параметра "releases.repo.owner" равно "owner"
+ И Количество значения параметра "changelog.filters.include" равно "4"
+
+Сценарий: Подстановка значене после чтения параметров в формате yaml
+
+ Допустим Я добавляю файл ".config.yaml" в каталог проекта с содержанием
+ """
+ ИмяПроекта: &app_name test-app
+
+ build:
+ binary: *app_name
+
+ releases:
+ repo:
+ name: test
+ owner: owner
+ replace: "test/%releases.repo.name%"
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Значение параметра "build.binary" равно "test-app"
+ И Значение параметра "releases.repo.name" равно "test"
+ И Значение параметра "releases.repo.owner" равно "owner"
+ И Значение параметра "replace" равно "test/test"
+
+Сценарий: Чтение вложенных файлов параметров yaml
+
+ Допустим Я добавляю файл ".config.yaml" в каталог проекта с содержанием
+ """
+ ИмяПроекта: &app_name test-app
+
+ build:
+ binary: *app_name
+
+ releases:
+ ReadFile: .add.yaml
+ """
+ И Я добавляю файл ".add.yaml" в каталог проекта с содержанием
+ """
+ repo:
+ name: test
+ owner: owner
+ """
+ Когда Я выполняю чтение параметров
+ Тогда Значение параметра "build.binary" равно "test-app"
+ И Значение параметра "releases.repo.name" равно "test"
+ И Значение параметра "releases.repo.owner" равно "owner"
+
diff --git a/packagedef b/packagedef
index 9627f09..68a5de0 100644
--- a/packagedef
+++ b/packagedef
@@ -4,22 +4,22 @@
//
Описание.Имя("configor")
- .Версия("0.2.1")
- .Автор("Khoreva Aleksey")
+ .Версия("0.5.0")
+ .Автор("Khorev Aleksey")
.АдресАвтора("Khorevaa@gmail.com")
.Описание("Библиотека для работы с конфигурационными файлами в формате json, yaml")
- .ВерсияСреды("1.0.18")
+ .ВерсияСреды("1.0.19")
.ВключитьФайл("src")
.ВключитьФайл("docs")
- .ВключитьФайл("tests")
+ //.ВключитьФайл("tests")
.ЗависитОт("logos")
.ЗависитОт("json")
+ .ЗависитОт("yaml")
.ЗависитОт("asserts")
- //.ЗависитОт("package3", ">=1.1", "<2.0")
- //.ЗависитОт("package4", ">=1.1", "<2.0")
+ .ЗависитОт("fluent", "0.3.1")
+ .ЗависитОт("notify", "0.2.0")
+ .ЗависитОт("tempfiles")
+ .ЗависитОт("reflector", "0.3.1")
.ОпределяетКласс("МенеджерПараметров", "src/Классы/МенеджерПараметров.os")
- .ОпределяетКласс("ПровайдерПараметровJSON", "src/Классы/ПровайдерПараметровJSON.os")
- .ОпределяетКласс("ПровайдерПараметровYAML", "src/Классы/ПровайдерПараметровYAML.os")
- .ОпределяетМодуль("ВстроенныеПровайдеры", "src/Модули/ВстроенныеПровайдеры.os")
- .ОпределяетМодуль("РаботаСПараметрами", "src/Модули/РаботаСПараметрами.os")
+ .ОпределяетКласс("КонструкторПараметров", "src/Классы/КонструкторПараметров.os")
;
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 0000000..fdfb257
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,18 @@
+# must be unique in a given SonarQube instance
+sonar.projectKey=opensource-configor
+sonar.organization=sonar-opensource-add
+
+# this is the name displayed in the SonarQube UI
+sonar.projectName=Enchanted config reader and writer for OScript
+
+# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
+# Since SonarQube 4.2, this property is optional if sonar.modules is set.
+# If not set, SonarQube starts looking for source code from the directory containing
+# the sonar-project.properties file.
+
+sonar.sources=./src
+
+# Encoding of the source code. Default is default system encoding
+sonar.sourceEncoding=UTF-8
+
+sonar.coverageReportPaths=coverage/genericCoverage.xml
diff --git a/sonar-qube.sh b/sonar-qube.sh
new file mode 100755
index 0000000..f56f2f2
--- /dev/null
+++ b/sonar-qube.sh
@@ -0,0 +1,22 @@
+temp=`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'`
+version=${temp##*|}
+
+if [ "$TRAVIS_SECURE_ENV_VARS" == "true" ]; then
+ if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
+ sonar-scanner \
+ -Dsonar.host.url=https://sonar.silverbulleters.org \
+ -Dsonar.analysis.mode=issues \
+ -Dsonar.github.pullRequest=$TRAVIS_PULL_REQUEST \
+ -Dsonar.github.repository=$TRAVIS_REPO_SLUG \
+ -Dsonar.github.oauth=$GITHUB_OAUTH_TOKEN \
+ -Dsonar.login=$SONAR_TOKEN \
+ -Dsonar.scanner.skip=false
+
+ elif [ "$TRAVIS_BRANCH" == "develop" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
+ sonar-scanner \
+ -Dsonar.host.url=https://sonar.silverbulleters.org \
+ -Dsonar.login=$SONAR_TOKEN \
+ -Dsonar.projectVersion=$version\
+ -Dsonar.scanner.skip=false
+ fi
+fi
\ No newline at end of file
diff --git a/sonarlint.json b/sonarlint.json
new file mode 100644
index 0000000..46765a9
--- /dev/null
+++ b/sonarlint.json
@@ -0,0 +1,5 @@
+{
+ "$schema": "https://raw.githubusercontent.com/silverbulleters/sonarqube-inject-vsc/master/schemas/sonarlint.json",
+ "serverId": "SB",
+ "projectKey": "opensource-cli"
+}
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\275\320\264\320\265\320\272\321\201\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\275\320\264\320\265\320\272\321\201\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os"
new file mode 100644
index 0000000..3628dbf
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\275\320\264\320\265\320\272\321\201\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.os"
@@ -0,0 +1,147 @@
+
+#Использовать logos
+
+Перем Лог;
+Перем ИндексКоллекция; // Соответствие
+Перем ИндексСформирован; // Булево
+Перем КоллекцияИндекса; // Произвольный
+
+Функция Коллекция(Знач ВходящаяКоллекция) Экспорт
+
+ КоллекцияИндекса = ВходящаяКоллекция;
+ ИндексСформирован = Ложь;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+Процедура Очистить() Экспорт
+
+ КоллекцияИндекса = Неопределено;
+ ИндексСформирован = Ложь;
+
+КонецПроцедуры
+
+Функция ПолучитьИндекс() Экспорт
+
+ ПроверитьИндекс();
+
+ Возврат ИндексКоллекция;
+
+КонецФункции
+
+Функция Значение(Знач КлючИндекса) Экспорт
+
+ ПроверитьИндекс();
+
+ ЗначениеИзИндекса = ИндексКоллекция[КлючИндекса];
+
+ Возврат ЗначениеИзИндекса;
+
+КонецФункции
+
+Процедура СформироватьИндекс()
+
+ ИндексКоллекция = Новый Соответствие;
+
+ // Рекурсивный вызов для входящих параметров
+ ДобавитьЗначениеПараметра("", КоллекцияИндекса);
+
+КонецПроцедуры
+
+Процедура ПроверитьИндекс()
+
+ Если КоллекцияИндекса = Неопределено Тогда
+ ВызватьИсключение Новый ИнформацияОбОшибке("Коллекция индекса не установлена");
+ КонецЕсли;
+
+ Если НЕ ИндексСформирован Тогда
+ СформироватьИндекс();
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ЭтоМассив(Знач Значение)
+ Возврат ТипЗнч(Значение) = Тип("Массив");
+КонецФункции
+
+Функция ЭтоСоответствие(Знач Значение)
+ Возврат ТипЗнч(Значение) = Тип("Соответствие");
+КонецФункции
+
+Функция ЭтоСтруктура(Знач Значение)
+ Возврат ТипЗнч(Значение) = Тип("Структура");
+КонецФункции
+
+Функция ЭтоОбъект(Знач Значение)
+ Возврат ТипЗнч(Значение) = Тип("Сценарий");
+КонецФункции
+
+Процедура ДобавитьПараметрВИндекс(Знач ИмяПараметра, Знач ЗначениеПараметра)
+
+ // Вставляем все значение целиком
+ Если Не ПустаяСтрока(ИмяПараметра) Тогда
+ Лог.Отладка("Добавляю параметр <%1> со значением <%2> в индекс", ИмяПараметра, ЗначениеПараметра);
+ ИндексКоллекция.Вставить(ИмяПараметра, ЗначениеПараметра);
+ КонецЕсли;
+
+ // Рекурсивное заполнение значения параметра
+ ДобавитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра);
+
+КонецПроцедуры
+
+Процедура ДобавитьЗначениеПараметра(Знач ИмяПараметра, Знач ЗначениеПараметра)
+
+ Если ЭтоМассив(ЗначениеПараметра) Тогда
+ ДобавитьПараметрМассивВИндекс(ЗначениеПараметра, ИмяПараметра);
+ ИначеЕсли ЭтоСоответствие(ЗначениеПараметра) Тогда
+ ДобавитьСоответствиеВИндекс(ЗначениеПараметра, ИмяПараметра);
+ ИначеЕсли ЭтоСтруктура(ЗначениеПараметра) Тогда
+ ДобавитьСоответствиеВИндекс(ЗначениеПараметра, ИмяПараметра);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ДобавитьПараметрМассивВИндекс(Знач МассивЗначений, Знач ИмяРодителя = "")
+
+ Лог.Отладка("Обрабатываю массив значений <%1> ", ИмяРодителя);
+
+ ШаблонИмениПараметра = "%1";
+
+ Если Не ПустаяСтрока(ИмяРодителя) Тогда
+ ШаблонИмениПараметра = ИмяРодителя + ".%1";
+ КонецЕсли;
+
+ Для ИндексЗначения = 0 По МассивЗначений.ВГраница() Цикл
+
+ ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, ИндексЗначения);
+ ДобавитьПараметрВИндекс(ИмяПараметра, МассивЗначений[ИндексЗначения]);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьСоответствиеВИндекс(Знач ВходящиеПараметры, Знач ИмяРодителя = "")
+
+ Лог.Отладка("Обрабатываю соответствие значений <%1> ", ИмяРодителя);
+
+ ШаблонИмениПараметра = "%1";
+
+ Если Не ПустаяСтрока(ИмяРодителя) Тогда
+ ШаблонИмениПараметра = ИмяРодителя + ".%1";
+ КонецЕсли;
+
+ Для каждого КлючЗначение Из ВходящиеПараметры Цикл
+
+ Лог.Отладка("Обрабатываю соответствие ключ <%1> ", КлючЗначение.Ключ);
+
+ ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, КлючЗначение.Ключ);
+ ЗначениеПараметра = КлючЗначение.Значение;
+
+ ДобавитьПараметрВИндекс(ИмяПараметра, ЗначениеПараметра);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.index");
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\237\320\276\320\270\321\201\320\272\320\260\320\244\320\260\320\271\320\273\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\237\320\276\320\270\321\201\320\272\320\260\320\244\320\260\320\271\320\273\320\260.os"
new file mode 100644
index 0000000..9d33bd8
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\237\320\276\320\270\321\201\320\272\320\260\320\244\320\260\320\271\320\273\320\260.os"
@@ -0,0 +1,68 @@
+Перем ПриоритетПоиска;
+Перем КаталогПоиска;
+Перем НаименованиеФайлаПоиска;
+Перем РасширениеФайлаПоиска;
+Перем НайденныйФайл;
+
+// Возвращает приоритет данного файла
+//
+// Возвращаемое значение:
+// Число - приоритет поиска
+//
+Функция Приоритет() Экспорт
+ Возврат ПриоритетПоиска;
+КонецФункции
+
+// Возвращает расширение файла для поиска
+//
+// Возвращаемое значение:
+// Строка - текущее расширение файла поиска
+//
+Функция РасширениеФайла() Экспорт
+ Возврат РасширениеФайлаПоиска;
+КонецФункции
+
+// Возвращает полный путь к найденному файлу
+//
+// Возвращаемое значение:
+// Строка - полный путь к найденному файлу
+//
+Функция ИмяФайла() Экспорт
+ Возврат НайденныйФайл;
+КонецФункции
+
+// Выполняет поиск файла в каталоге
+//
+// Возвращаемое значение:
+// Булево - результат поиска, истина - файл найдет
+//
+Функция ПоискФайла() Экспорт
+
+ ПолноеНаименованиеФайлаПоиска = СформироватьПолноеНаименование();
+
+ ПутьКФайлуПоиска = ОбъединитьПути(КаталогПоиска, ПолноеНаименованиеФайлаПоиска);
+
+ ФайлПараметровПоиска = Новый Файл(ПутьКФайлуПоиска);
+
+ РезультатПоиска = ФайлПараметровПоиска.Существует();
+
+ НайденныйФайл = ФайлПараметровПоиска.ПолноеИмя;
+
+ Возврат РезультатПоиска;
+
+КонецФункции
+
+Функция СформироватьПолноеНаименование()
+
+ Возврат СтрШаблон("%1.%2", НаименованиеФайлаПоиска, РасширениеФайлаПоиска);
+
+КонецФункции
+
+Процедура ПриСозданииОбъекта(ВходящийКаталогПоиска, ВходящееНаименованиеПоиска, ВходящиееРасширениеФайлаПоиска, Приоритет)
+
+ КаталогПоиска = ВходящийКаталогПоиска;
+ НаименованиеФайлаПоиска = ВходящееНаименованиеПоиска;
+ РасширениеФайлаПоиска = ВходящиееРасширениеФайлаПоиска;
+ ПриоритетПоиска = Приоритет;
+
+КонецПроцедуры
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\263\320\276\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\263\320\276\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260.os"
new file mode 100644
index 0000000..d7083ce
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\244\320\260\320\271\320\273\320\276\320\262\320\276\320\263\320\276\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\260.os"
@@ -0,0 +1,189 @@
+
+Перем ПутьКФайлуПараметров; // Строка
+Перем КаталогиПоиска; // Массив
+Перем РасширенияФайлаПараметров; // Массив
+Перем НаименованияФайлаПараметров; // Массив
+Перем НаправлениеСортировкиКаталогов; // Строка
+Перем ЧитатьТолькоОдинФайл; // Булево
+Перем ВложенныйКаталогПоиска; // Строка
+
+#Область Публичное_API
+
+// Устанавливает путь к файлу параметров
+//
+// Параметры:
+// ПутьКФайлу - Строка - полный путь к файлу параметров
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция УстановитьФайлПараметров(Знач ПутьКФайлу) Экспорт
+
+ ПутьКФайлуПараметров = ПутьКФайлу;
+
+ ЧитатьТолькоОдинФайл = Истина;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Устанавливает дополнительную строку добавляемую к каталогам поиска
+//
+// Параметры:
+// ИмяВложенногоКаталогаПоиска - Строка - дополнительная строка, добавляемая к каталогам поиска
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция УстановитьВложенныйКаталогПоиска(Знач ИмяВложенногоКаталогаПоиска) Экспорт
+
+ ВложенныйКаталогПоиска = ИмяВложенногоКаталогаПоиска;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Возвращает структуру настроек провайдера
+//
+// Возвращаемое значение:
+// Структура - подготовленная структура настроек для файловых провайдеров
+// * ПутьКФайлуПараметров - Строка - путь к установленному файлу параметров
+// * КаталогиПоиска - Массив - массив строк, путей для поиска файла
+// * ВложенныйКаталог - Строка - дополнительный каталог в каталогах поиска
+// * НаименованияФайлаПараметров - Массив - массив строк, массив имен файлов параметров
+// * РасширенияФайлаПараметров - Массив - массив строк, массив расширений файлов параметров
+// * НаправлениеСортировки - Строка - направления обхода каталогов поиска (ВОЗР или УБЫВ)
+// * ЧитатьТолькоОдинФайл - Булево - признак чтения до первого найденного файла
+//
+Функция ПолучитьНастройки() Экспорт
+
+ Настройка = Новый Структура();
+ Настройка.Вставить("ПутьКФайлуПараметров", ПутьКФайлуПараметров);
+ Настройка.Вставить("КаталогиПоиска", КаталогиПоиска);
+ Настройка.Вставить("ВложенныйКаталог", ВложенныйКаталогПоиска);
+ Настройка.Вставить("НаименованияФайлаПараметров", НаименованияФайлаПараметров);
+ Настройка.Вставить("РасширенияФайлаПараметров", РасширенияФайлаПараметров);
+ Настройка.Вставить("НаправлениеСортировки", НаправлениеСортировкиКаталогов);
+ Настройка.Вставить("ЧитатьТолькоОдинФайл", ЧитатьТолькоОдинФайл);
+
+ Возврат Настройка;
+
+КонецФункции
+
+// Добавляет дополнительный путь к каталогу поиска файла параметров
+//
+// Параметры:
+// ПутьПоискаФайлов - Строка - полный путь к дополнительному каталогу для поиска файла параметров
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция ДобавитьКаталогПоиска(Знач ПутьПоискаФайлов) Экспорт
+
+ КаталогиПоиска.Добавить(ПутьПоискаФайлов);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Выполняет очистку путей поиска
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция ОчиститьПутиПоиска() Экспорт
+
+ КаталогиПоиска.Очистить();
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Добавляет имя файла параметров
+//
+// Параметры:
+// ИмяФайла - Строка - имя файла параметров
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция УстановитьИмяФайла(Знач ИмяФайла) Экспорт
+
+ ДобавитьЗначениеВМассив(НаименованияФайлаПараметров, ИмяФайла);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Устанавливает расширение файла параметров
+//
+// Параметры:
+// РасширениеФайла - Строка - расширение файла параметров (например, .json или json)
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция УстановитьРасширениеФайла(Знач РасширениеФайла) Экспорт
+
+ Если Не СтрНачинаетсяС(РасширениеФайла, ".") Тогда
+ РасширениеФайла = "." + РасширениеФайла;
+ КонецЕсли;
+
+ ДобавитьЗначениеВМассив(РасширенияФайлаПараметров, РасширениеФайла);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Устанавливает стандартные каталоги поиска
+//
+// Параметры:
+// ВложенныйПодкаталог - Строка - дополнительная строка, добавляемая к каталогам поиска
+//
+// Возвращаемое значение:
+// Объект.НастройкиФайловогоПровайдера - ссылка на текущий элемент класса <НастройкиФайловогоПровайдера>
+//
+Функция УстановитьСтандартныеКаталогиПоиска(Знач ВложенныйПодкаталог = "") Экспорт
+
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+
+ ДобавитьКаталогПоиска(ТекущийКаталог());
+ ДобавитьКаталогПоиска(СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ПрофильПользователя));
+ ДобавитьКаталогПоиска(СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ЛокальныйКаталогДанныхПриложений));
+
+ Если ЗначениеЗаполнено(ВложенныйПодкаталог) Тогда
+ УстановитьВложенныйКаталогПоиска(ВложенныйПодкаталог);
+ КонецЕсли;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Вспомогательные_процедуры_и_функции
+
+Процедура ДобавитьЗначениеВМассив(МассивДобавления, Знач НовоеЗначениеМассива)
+
+ Если МассивДобавления.Найти(НовоеЗначениеМассива) = Неопределено Тогда
+ МассивДобавления.Добавить(НовоеЗначениеМассива);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПриСозданииОбъекта(ИспользоватьСтандартныеКаталогиПоиска = Ложь, ВложенныйПодкаталог = "")
+
+ НаименованияФайлаПараметров = Новый Массив;
+ РасширенияФайлаПараметров = Новый Массив;
+ КаталогиПоиска = Новый Массив;
+
+ НаправлениеСортировкиКаталогов = "УБЫВ";
+ ЧитатьТолькоОдинФайл = Ложь;
+
+ Если ИспользоватьСтандартныеКаталогиПоиска = Истина Тогда
+ УстановитьСтандартныеКаталогиПоиска(ВложенныйПодкаталог);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\273\320\265\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\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/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\273\320\265\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\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..1ef1fbe
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\273\320\265\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\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,261 @@
+#Использовать logos
+
+Перем Имя Экспорт; // Строка, наименование текущего поля
+Перем Тип Экспорт; // ОписаниеТипов
+Перем ТипЭлемента Экспорт; // ОписаниеТипов
+Перем ЭтоМассив Экспорт; // Булево
+Перем ЭтоОбъект Экспорт; // Булево
+Перем Синонимы Экспорт; // Массив, элементы строка
+Перем РодительКонструктор; // Объект
+Перем ОбъектКонструктор; // Объект
+
+Перем Значение Экспорт; // Текущее значение поля
+
+Процедура ПриСозданииОбъекта(РодительПоля,
+ ИмяПоля,
+ ТипПоля,
+ ТипЭлементаПоля = Неопределено,
+ ОбъектПоля= Неопределено)
+
+ Синонимы = СтрРазделить(ИмяПоля, " ", Ложь);
+ Имя = Синонимы[0];
+ Тип = ТипПоля;
+
+ РодительКонструктор = РодительПоля;
+
+ Если ТипЭлементаПоля = Неопределено Тогда
+ Если ТипПоля = Тип("Массив") Тогда
+ ТипЭлементаПоля = Тип("Строка");
+ Иначе
+ ТипЭлементаПоля = ТипПоля;
+ КонецЕсли;
+ КонецЕсли;
+
+ ТипЭлемента = ТипЭлементаПоля;
+ ЭтоМассив = Тип("Массив") = ТипПоля;
+ ОбъектКонструктор = ОбъектПоля;
+ ЭтоОбъект = Тип("КонструкторПараметров") = ТипЗнч(ОбъектПоля);
+
+ РодительКонструктор.ДобавитьСинонимыПоляВИндекс(ЭтотОбъект);
+
+КонецПроцедуры
+
+// Выполняет преобразование объекта конструктора из соответствия
+//
+// Параметры:
+// ВходящиеСоответствие - Соответствие - входящее соответствие
+//
+// Возвращаемое значение:
+// Произвольный - <описание возвращаемого значения>
+//
+Функция ИзСоответствия(Знач ВходящиеСоответствие) Экспорт
+
+ Если ОбъектКонструктор.Использован() Тогда
+ НовыйКонструктор = ОбъектКонструктор.Скопировать();
+ Возврат НовыйКонструктор.ИзСоответствия(ВходящиеСоответствие);
+ КонецЕсли;
+
+ Возврат ОбъектКонструктор.ИзСоответствия(ВходящиеСоответствие);
+КонецФункции
+
+#Область Работа_с_свойствами_класса
+
+// Добавляет для поля дополнительный синоним
+//
+// Параметры:
+// НовыйСиноним - Строка - дополнительный синоним поля
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция Синоним(Знач НовыйСиноним) Экспорт
+
+ Синонимы.Добавить(НовыйСиноним);
+
+ РодительКонструктор.ДобавитьСинонимыПоляВИндекс(ЭтотОбъект);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Делает поле массивом
+//
+// Параметры:
+// ТипЭлементаМассива - ОписаниеТипов - тип элементов массива
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция Массив(Знач ТипЭлементаМассива) Экспорт
+
+ ЭтоМассив = Истина;
+ Тип = Тип("Массив");
+ ТипЭлемента = ТипЭлементаМассива;
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Производит установку значения поля по умолчанию
+//
+// Параметры:
+// НовоеЗначение - Число, Строка, Дата, Массив, Объект - Значение поля по умолчанию
+//
+Процедура УстановитьЗначение(НовоеЗначение) Экспорт
+ Значение = НовоеЗначение;
+КонецПроцедуры
+
+// Возвращает родителя (владельца) конструктора поля
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на элемент класса <КонструкторПараметров>
+//
+Функция Конструктор() Экспорт
+
+ Возврат РодительКонструктор;
+
+КонецФункции
+
+// Получает описание поля для создания нового поля по основании
+//
+// Возвращаемое значение:
+// Структура - описание поля с ключами:
+// * Имя - Строка - Наименование поля (несколько указываются через пробел)
+// * Тип - Тип - Тип значения поля
+// * ТипЭлемента - Тип - Тип элемента поля для массива
+// * Родитель - Объект.КонструкторПараметров - ссылка на элемент класса <КонструкторПараметров>
+// * ОбъектЭлемента - Объект.КонструкторПараметров - ссылка на элемент класса <КонструкторПараметров>
+// * ЗначениеПоУмолчанию - Произвольный - произвольное значение по умолчанию
+//
+Функция ОписаниеПоля() Экспорт
+
+ СтруктураВозврата = Новый Структура();
+ СтруктураВозврата.Вставить("Имя", СтрСоединить(Синонимы, " "));
+ СтруктураВозврата.Вставить("Тип", Тип);
+ СтруктураВозврата.Вставить("ТипЭлемента", ТипЭлемента);
+ СтруктураВозврата.Вставить("Родитель", РодительКонструктор);
+ СтруктураВозврата.Вставить("ОбъектЭлемента", ОбъектКонструктор);
+ СтруктураВозврата.Вставить("ЗначениеПоУмолчанию", Значение);
+
+ Возврат СтруктураВозврата;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Работа_с_текучими_функциями
+
+// Создает и возвращает новое поле-объект конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ОбъектПоля - Объект.КонструкторПараметров - ссылка на объект поле
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеОбъект(Знач ИмяПоля, Знач ОбъектПоля) Экспорт
+
+ Возврат РодительКонструктор.ПолеОбъект(ИмяПоля, ОбъектПоля);
+
+КонецФункции
+
+// Создает и возвращает новое поле-строка конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ТипЭлемента - строка - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеМассив(Знач ИмяПоля, Знач ТипЭлемента) Экспорт
+
+ Возврат РодительКонструктор.ПолеМассив(ИмяПоля, ТипЭлемента);
+
+КонецФункции
+
+// Создает и возвращает новое поле-строка конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - строка - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеСтрока(Знач ИмяПоля, ЗначениеПоУмолчанию = "") Экспорт
+
+ Возврат РодительКонструктор.ПолеСтрока(ИмяПоля, ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-число конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Число - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеЧисло(Знач ИмяПоля, ЗначениеПоУмолчанию = 0) Экспорт
+
+ Возврат РодительКонструктор.ПолеЧисло(ИмяПоля, ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-дата конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Дата - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеДата(Знач ИмяПоля, ЗначениеПоУмолчанию = Неопределено) Экспорт
+
+ Возврат РодительКонструктор.ПолеДата(ИмяПоля, ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-булево конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Булево - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеБулево(Знач ИмяПоля, ЗначениеПоУмолчанию = Ложь) Экспорт
+
+ Возврат РодительКонструктор.ПолеБулево(ИмяПоля, ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Удаляет поле из конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача синонима поля.
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция УдалитьПоле(Знач ИмяПоля) Экспорт
+
+ Возврат РодительКонструктор.УдалитьПоле(ИмяПоля);
+
+КонецФункции
+
+// Устанавливает признак содержания произвольных полей конструктора параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция ПроизвольныеПоля() Экспорт
+ Возврат РодительКонструктор.ПроизвольныеПоля();
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\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..3a8a141
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -0,0 +1,126 @@
+#Использовать reflector
+
+Перем ТипПровайдера Экспорт; // Файл, Произвольный
+Перем Приоритет Экспорт; // Число
+Перем Идентификатор Экспорт; // Строка
+Перем Включен Экспорт; // Булево
+
+Перем КлассПровайдера; // Произвольный класс
+Перем РеализованИнтерфейсЗаписи; // Булево
+Перем РеализованИнтерфейсЧтения; // Булево
+
+// Выполняет чтение параметров для провайдера
+//
+// Параметры:
+// НастройкиПровайдера - Структура - структура настроек провайдера
+//
+// Возвращаемое значение:
+// Соответствие - результат чтения провайдера
+//
+Функция ПрочитатьПараметры(Знач НастройкиПровайдера) Экспорт
+
+ Если Не Включен Тогда
+ Возврат Новый Соответствие;
+ КонецЕсли;
+
+ Если НЕ РеализованИнтерфейсЧтения Тогда
+ Возврат Новый Соответствие;
+ КонецЕсли;
+
+ Возврат КлассПровайдера.ПрочитатьПараметры(НастройкиПровайдера);
+
+КонецФункции
+
+// Отключает использование провайдера
+//
+Процедура Отключить() Экспорт
+ Включен = Ложь;
+КонецПроцедуры
+
+// Включает использование провайдера
+//
+Процедура Включить() Экспорт
+ Включен = Истина;
+КонецПроцедуры
+
+// Устанавливает приоритет провайдера
+//
+// Параметры:
+// НовыйПриоритет - Число - новый приоритет провайдера
+//
+Процедура УстановитьПриоритет(Знач НовыйПриоритет) Экспорт
+ Приоритет = НовыйПриоритет;
+КонецПроцедуры
+
+// Выполняет запись данных провайдера
+//
+// Параметры:
+// НастройкиПровайдера - Структура - структура настроек провайдера
+//
+Процедура ЗаписатьПараметры(Знач НастройкиПровайдера) Экспорт
+
+ Если Не Включен Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ РеализованИнтерфейсЗаписи Тогда
+ Возврат;
+ КонецЕсли;
+
+ КлассПровайдера.ЗаписатьПараметры(НастройкиПровайдера);
+
+КонецПроцедуры
+
+// Возвращает признак того, что провайдер является файловым
+//
+// Возвращаемое значение:
+// Булево - признак того, что данный провайдер является файловым
+//
+Функция ЭтоФайловыйПровайдер() Экспорт
+
+ Возврат ВРег(ТипПровайдера) = ВРег("Файл")
+ ИЛИ ВРег(ТипПровайдера) = ВРег("file");
+
+КонецФункции
+
+Процедура ПриСозданииОбъекта(Знач ВходящийКлассПровайдера)
+
+ ИнтерфейсПровайдера = Новый ИнтерфейсОбъекта;
+ ИнтерфейсПровайдера.Ф("Приоритет");
+ ИнтерфейсПровайдера.Ф("Идентификатор");
+ ИнтерфейсПровайдера.Ф("ТипПровайдера");
+
+ ИнтерфейсЧтения = Новый ИнтерфейсОбъекта;
+ ИнтерфейсЧтения.Ф("ПрочитатьПараметры", 1);
+
+ ИнтерфейсЗаписи = Новый ИнтерфейсОбъекта;
+ ИнтерфейсЗаписи.Ф("ЗаписатьПараметры", 1);
+
+ РефлекторОбъекта = Новый РефлекторОбъекта(ВходящийКлассПровайдера);
+
+ РеализованИнтерфейсЧтения = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсЧтения);
+ РеализованИнтерфейсЗаписи = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсЗаписи);
+ РеализованИнтерфейсПровайдера = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсПровайдера);
+
+ ПроверкаПровайдера = РеализованИнтерфейсПровайдера
+ И (РеализованИнтерфейсЧтения
+ ИЛИ РеализованИнтерфейсЗаписи);
+
+ Если НЕ ПроверкаПровайдера Тогда
+ // TODO: Добавить описание того что реализовано а что нет
+ ВызватьИсключение "Не реализован необходимый интерфейс провайдера";
+ КонецЕсли;
+
+ ТипПровайдера = ВходящийКлассПровайдера.ТипПровайдера();
+
+ Если ЭтоФайловыйПровайдер() Тогда
+ КлассПровайдера = Новый ФайловыйПровайдерПараметров(ВходящийКлассПровайдера);
+ Иначе
+ КлассПровайдера = ВходящийКлассПровайдера;
+ КонецЕсли;
+
+ Приоритет = КлассПровайдера.Приоритет();
+ Идентификатор = КлассПровайдера.Идентификатор();
+ Включен = Истина;
+
+КонецПроцедуры
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
new file mode 100644
index 0000000..a5924d9
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
@@ -0,0 +1,187 @@
+#Использовать json
+#Использовать asserts
+#Использовать logos
+
+Перем Лог;
+Перем ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек;
+
+#Область ПрограммныйИнтерфейс
+
+// Возвращает приоритет провайдера
+//
+// Возвращаемое значение:
+// Число - текущий приоритет провайдера
+//
+Функция Приоритет() Экспорт
+ Возврат 1;
+КонецФункции
+
+// Возвращает идентификатор провайдера
+//
+// Возвращаемое значение:
+// Строка - текущий идентификатор провайдера
+//
+Функция Идентификатор() Экспорт
+ Возврат "json";
+КонецФункции
+
+// Возвращает тип провайдера
+//
+// Возвращаемое значение:
+// Строка - текущий тип провайдера
+//
+Функция ТипПровайдера() Экспорт
+ Возврат "file";
+КонецФункции
+
+// Возвращает расширения файлов по умолчанию
+//
+// Возвращаемое значение:
+// Строка - расширения файлов по умолчанию (yaml yml)
+//
+Функция РасширенияФайлов() Экспорт
+ Возврат "json";
+КонецФункции
+
+// Выполняет чтение параметров для провайдера
+//
+// Параметры:
+// НастройкиПровайдера - Структура - структура настроек провайдера
+//
+// Возвращаемое значение:
+// Соответствие - результат чтения провайдера
+//
+Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт
+
+ ПрочитанныеПараметры = Новый Соответствие;
+
+ ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров);
+
+ Если Не ФайлПараметров.Существует() Тогда
+ Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя);
+ Возврат ПрочитанныеПараметры;
+ КонецЕсли;
+
+ Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя);
+ ПрочитанныеПараметры = Прочитать(ФайлПараметров.ПолноеИмя);
+
+ Возврат ПрочитанныеПараметры;
+
+КонецФункции
+
+// Выполнить чтение настроек из файла
+//
+// Параметры:
+// ПутьКФайлуНастройки - Cтрока - путь к файлу настроек
+// Возвращаемое значение:
+// Соответствие - итоговые параметры
+//
+Функция Прочитать(Знач ПутьКФайлуНастройки)
+
+ НастройкиИзФайла = Новый Соответствие;
+
+ Попытка
+
+ Лог.Отладка("ПутьКФайлуНастройки <%1>", ПутьКФайлуНастройки);
+
+ НастройкиИзФайла = ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки);
+
+ Лог.Отладка("Итоговые параметры:");
+ ПоказатьПараметрыВРежимеОтладки(НастройкиИзФайла);
+
+ Исключение
+
+ Лог.Ошибка("Ошибка чтения настроек
+ |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ВызватьИсключение;
+
+ КонецПопытки;
+
+ Возврат НастройкиИзФайла;
+
+КонецФункции // Прочитать
+
+Функция ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки)
+
+ ФайлНастроек = Новый Файл(ПутьКФайлуНастройки);
+
+ НастройкиИзФайла = ПрочитатьФайлJSON(ФайлНастроек.ПолноеИмя);
+
+ Возврат НастройкиИзФайла;
+
+КонецФункции // ПрочитатьНастройкиИзПараметраФайл()
+
+Функция ПрочитатьФайлJSON(Знач ИмяФайла)
+ Перем Параметры;
+
+ Лог.Отладка("Путь файла настроек <%1>", ИмяФайла);
+
+ СообщениеОшибки = СтрШаблон("Файл настроек не существует. Путь <%1>", ИмяФайла);
+ JsonСтрока = ПрочитатьФайл(ИмяФайла, СообщениеОшибки);
+
+ Лог.Отладка("Текст файла настроек:
+ |%1", JsonСтрока);
+
+ JsonСтрока = ВырезатьКомментарииИзТекстаJSON(JsonСтрока);
+
+ ПарсерJSON = Новый ПарсерJSON();
+ Параметры = ПарсерJSON.ПрочитатьJSON(JsonСтрока);
+
+ Возврат Параметры;
+КонецФункции
+
+Функция ПрочитатьФайл(Знач ИмяФайла, Знач СообщениеОшибки)
+ ФайлСуществующий = Новый Файл(ИмяФайла);
+ Если Не ФайлСуществующий.Существует() Тогда
+ ВызватьИсключение СообщениеОшибки;
+ КонецЕсли;
+
+ Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
+ Рез = Чтение.Прочитать();
+ Чтение.Закрыть();
+ Возврат Рез;
+КонецФункции // ПрочитатьФайл()
+
+Функция ВырезатьКомментарииИзТекстаJSON(Знач JsonСтрока)
+
+ // вырезаем обычные комменты типа "// комментарий"
+ Регулярка = Новый РегулярноеВыражение("(^\/\/.*$)");
+ Рез = Регулярка.Заменить(JsonСтрока, "$0" );
+
+ // вырезаем комменты после строки, например, "строка //комментарий"
+ Регулярка = Новый РегулярноеВыражение("(^.*)(\/\/.*$)");
+ Рез = Регулярка.Заменить(Рез, "$1" );
+
+ Возврат Рез;
+КонецФункции // ВырезатьКомментарииИзТекстаJSON()
+
+Процедура ПоказатьПараметрыВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "")
+
+ Если Родитель = "" Тогда
+ Лог.Отладка(" Тип параметров %1", ТипЗнч(ЗначенияПараметров));
+ КонецЕсли;
+
+ Если ЗначенияПараметров.Количество() = 0 Тогда
+ Лог.Отладка(" Коллекция параметров пуста!");
+ КонецЕсли;
+
+ Для каждого Элемент Из ЗначенияПараметров Цикл
+
+ ПредставлениеКлюча = Элемент.Ключ;
+
+ Если Не ПустаяСтрока(Родитель) Тогда
+ ПредставлениеКлюча = СтрШаблон("%1.%2", Родитель, ПредставлениеКлюча);
+ КонецЕсли;
+
+ Лог.Отладка(" Получен параметр <%1> = <%2>", ПредставлениеКлюча, Элемент.Значение);
+
+ Если ТипЗнч(Элемент.Значение) = Тип("Соответствие") Тогда
+ ПоказатьПараметрыВРежимеОтладки(Элемент.Значение, ПредставлениеКлюча);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.json");
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
new file mode 100644
index 0000000..ce35652
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
@@ -0,0 +1,160 @@
+#Использовать logos
+#Использовать yaml
+
+Перем Лог;
+
+#Область ПрограммныйИнтерфейс
+
+// Возвращает приоритет провайдера
+//
+// Возвращаемое значение:
+// Число - текущий приоритет провайдера
+//
+Функция Приоритет() Экспорт
+ Возврат 1;
+КонецФункции
+
+// Возвращает идентификатор провайдера
+//
+// Возвращаемое значение:
+// Строка - текущий идентификатор провайдера
+//
+Функция Идентификатор() Экспорт
+ Возврат "yaml";
+КонецФункции
+
+// Возвращает тип провайдера
+//
+// Возвращаемое значение:
+// Строка - текущий тип провайдера
+//
+Функция ТипПровайдера() Экспорт
+ Возврат "file";
+КонецФункции
+
+// Возвращает расширения файлов по умолчанию
+//
+// Возвращаемое значение:
+// Строка - расширения файлов по умолчанию (yaml yml)
+//
+Функция РасширенияФайлов() Экспорт
+ Возврат "yaml yml";
+КонецФункции
+
+// Выполняет чтение параметров для провайдера
+//
+// Параметры:
+// НастройкиПровайдера - Структура - структура настроек провайдера
+//
+// Возвращаемое значение:
+// Соответствие - результат чтения провайдера
+//
+Функция ПрочитатьПараметры(Знач НастройкиПровайдера) Экспорт
+
+ ПрочитанныеПараметры = Новый Соответствие;
+
+ ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров);
+
+ ПутьКФайлуПараметров = ФайлПараметров.ПолноеИмя;
+
+ Если Не ФайлПараметров.Существует() Тогда
+ Лог.Отладка("Не найден файл параметров <%1>", ПутьКФайлуПараметров);
+ Возврат ПрочитанныеПараметры;
+ КонецЕсли;
+
+ Попытка
+
+ Лог.Отладка("ПутьКФайлуПараметров <%1>", ПутьКФайлуПараметров);
+
+ ПрочитанныеПараметры = ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуПараметров);
+
+ Лог.Отладка("Итоговые параметры:");
+ ПоказатьПараметрыВРежимеОтладки(ПрочитанныеПараметры);
+
+ Исключение
+
+ Лог.Ошибка("Ошибка чтения настроек
+ |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ВызватьИсключение;
+
+ КонецПопытки;
+
+ Возврат ПрочитанныеПараметры;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Вспомогательные_процедуры_и_функции
+
+Функция ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки)
+
+ ФайлНастроек = Новый Файл(ПутьКФайлуНастройки);
+
+ НастройкиИзФайла = ПрочитатьФайлYAML(ФайлНастроек.ПолноеИмя);
+
+ Возврат НастройкиИзФайла;
+
+КонецФункции // ПрочитатьНастройкиИзПараметраФайл()
+
+Функция ПрочитатьФайлYAML(Знач ИмяФайла)
+ Перем Параметры;
+
+ Лог.Отладка("Путь файла настроек <%1>", ИмяФайла);
+
+ СообщениеОшибки = СтрШаблон("Файл настроек не существует. Путь <%1>", ИмяФайла);
+ YamlСтрока = ПрочитатьФайл(ИмяФайла, СообщениеОшибки);
+
+ Лог.Отладка("Текст файла настроек:
+ |%1", YamlСтрока);
+
+ ПроцессорЧтения = Новый ПарсерYaml;
+ Параметры = ПроцессорЧтения.ПрочитатьYaml(YamlСтрока);
+
+ Возврат Параметры;
+КонецФункции
+
+Функция ПрочитатьФайл(Знач ИмяФайла, Знач СообщениеОшибки)
+ ФайлСуществующий = Новый Файл(ИмяФайла);
+ Если Не ФайлСуществующий.Существует() Тогда
+ ВызватьИсключение СообщениеОшибки;
+ КонецЕсли;
+
+ Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
+ Рез = Чтение.Прочитать();
+ Чтение.Закрыть();
+ Возврат Рез;
+КонецФункции // ПрочитатьФайл()
+
+Процедура ПоказатьПараметрыВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "")
+
+ Если Родитель = "" Тогда
+ Лог.Отладка(" Тип параметров %1", ТипЗнч(ЗначенияПараметров));
+ КонецЕсли;
+
+ Если ЗначенияПараметров.Количество() = 0 Тогда
+ Лог.Отладка(" Коллекция параметров пуста!");
+ КонецЕсли;
+
+ Для каждого Элемент Из ЗначенияПараметров Цикл
+
+ ПредставлениеКлюча = Элемент.Ключ;
+
+ Если Не ПустаяСтрока(Родитель) Тогда
+ ПредставлениеКлюча = СтрШаблон("%1.%2", Родитель, ПредставлениеКлюча);
+ КонецЕсли;
+
+ Лог.Отладка(" Получен параметр <%1> = <%2>", ПредставлениеКлюча, Элемент.Значение);
+
+ Если ТипЗнч(Элемент.Значение) = Тип("Соответствие") Тогда
+ ПоказатьПараметрыВРежимеОтладки(Элемент.Значение, ПредставлениеКлюча);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.yaml");
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\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..c1dfc38
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/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\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -0,0 +1,532 @@
+#Использовать fluent
+#Использовать notify
+
+Перем ПутьКФайлуПараметров; // Строка
+Перем КаталогиПоиска; // Массив
+Перем РасширенияФайлаПараметров; // Массив
+Перем НаименованияФайлаПараметров; // Массив
+Перем КлассПровайдера; // Объект
+
+Перем ИндексКаталоговПоиска; // Соответствие
+Перем НастройкиПровайдера; // Структура
+
+Перем РезультатЧтения; // Соответствие
+
+Перем НаправлениеСортировки; // Строка
+Перем ЧитатьТолькоОдинФайл; // Булево
+
+Перем ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек; // Строка, По умолчанию
+
+Перем Лог;
+
+#Область Интерфейс_провайдера_параметров
+
+// Возвращает тип провайдера
+//
+// Возвращаемое значение:
+// Строка - текущий тип провайдера
+//
+Функция ТипПровайдера() Экспорт
+
+ Возврат КлассПровайдера.ТипПровайдера();
+
+КонецФункции
+
+// Возвращает идентификатор провайдера
+//
+// Возвращаемое значение:
+// Строка - текущий идентификатор провайдера
+//
+Функция Идентификатор() Экспорт
+
+ Возврат КлассПровайдера.Идентификатор();
+
+КонецФункции
+
+// Возвращает приоритет провайдера
+//
+// Возвращаемое значение:
+// Число - текущий приоритет провайдера
+//
+Функция Приоритет() Экспорт
+
+ Возврат КлассПровайдера.Приоритет();
+
+КонецФункции
+
+// Выполняет чтение параметров для провайдера
+//
+// Параметры:
+// ВходящиеНастройкиПровайдера - Структура - структура настроек провайдера
+//
+// Возвращаемое значение:
+// Соответствие - результат чтения провайдера
+//
+Функция ПрочитатьПараметры(Знач ВходящиеНастройкиПровайдера) Экспорт
+
+ ПрочитатьНастройки(ВходящиеНастройкиПровайдера);
+
+ НастройкиПровайдера = ВходящиеНастройкиПровайдера;
+
+ Возврат ПрочитатьПараметрыПоНастройкам();
+
+КонецФункции
+
+// Выполняет запись данных провайдера
+//
+// Параметры:
+// НастройкиПровайдера - Структура - структура настроек провайдера
+//
+Процедура ЗаписатьПараметры(Знач НастройкиПровайдера) Экспорт
+
+ КлассПровайдера.ЗаписатьПараметры(НастройкиПровайдера);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Дополнительные_экспортные_процедуры
+
+// Добавляет дополнительное расширение файла параметров
+//
+// Параметры:
+// ВходящиеРасширениеФайлов - Строка - дополнительное расширение файла параметров
+//
+Процедура ДобавитьРасширениеФайла(Знач ВходящиеРасширениеФайлов) Экспорт
+ РасширенияФайлаПараметров.Добавить(ВходящиеРасширениеФайлов);
+КонецПроцедуры
+
+// Добавляет дополнительное наименование файла параметров
+//
+// Параметры:
+// ВходящееНаименованиеФайла - Строка - Наименование файла параметров
+//
+Процедура ДобавитьНаименованиеФайла(Знач ВходящееНаименованиеФайла) Экспорт
+ НаименованияФайлаПараметров.Добавить(ВходящееНаименованиеФайла);
+КонецПроцедуры
+
+// Возвращает массив расширений файлов для провайдера
+//
+// Возвращаемое значение:
+// Массив - строка расширений
+//
+Функция РасширенияФайлов() Экспорт
+ Возврат РасширенияФайлаПараметров;
+КонецФункции
+
+#КонецОбласти
+
+#Область Вспомогательные_процедуры_и_функции
+
+Процедура УстановитьНаправлениеСортировки(ВходящееНаправлениеСортировки)
+
+ Если НЕ НаправлениеСортировкиКорректное(ВходящееНаправлениеСортировки) Тогда
+ ВызватьИсключение СтрШаблон("Переданная <%1> сортировка не корректная", ВходящееНаправлениеСортировки);
+ КонецЕсли;
+
+ НаправлениеСортировки = ВходящееНаправлениеСортировки;
+
+КонецПроцедуры
+
+Функция НаправлениеСортировкиКорректное(ТекстНаправлениеСортировки)
+
+ Возврат ВРег(ТекстНаправлениеСортировки) = ВРег("ВОЗР")
+ ИЛИ ВРег(ТекстНаправлениеСортировки) = ВРег("УБЫВ")
+ ;
+
+КонецФункции
+
+Процедура ДобавитьКаталогПоискаВИндекс(КаталогПоиска, Приоритет, НаименованиеФайла, РасширениеФайла)
+
+ ИндексКаталоговПоиска.Добавить(Новый КаталогПоискаФайла(КаталогПоиска, НаименованиеФайла, РасширениеФайла, Приоритет));
+
+КонецПроцедуры
+
+Функция ПрочитатьПараметрыПоНастройкам()
+
+ РезультатЧтения = Новый Соответствие;
+
+ Если ЗначениеЗаполнено(ПутьКФайлуПараметров) Тогда
+
+ ФайлПараметров = Новый Файл(ПутьКФайлуПараметров);
+ НачальныйСимвол = 2;
+ РасширениеФайла = Сред(ФайлПараметров.Расширение, НачальныйСимвол);
+
+ РасширениеНайдено = РасширенияФайлаПараметров.Найти(НРег(РасширениеФайла));
+
+ Если РасширениеНайдено = Неопределено Тогда
+ Возврат РезультатЧтения;
+ КонецЕсли;
+
+ ВыполнитьЧтениеФайловогоПровайдера(ПутьКФайлуПараметров);
+ Иначе
+ ВыполнитьПоискИЧтениеФайловПараметров();
+ КонецЕсли;
+
+ Возврат РезультатЧтения;
+
+КонецФункции
+
+Процедура ВыполнитьПоискИЧтениеФайловПараметров()
+
+ ИндексКаталоговПоиска = Новый Массив;
+
+ СформироватьИндексКаталогПоиска();
+
+ ФункцияСортировки = Новый ОписаниеОповещения("СортироватьКаталогиПоискаФайлов", ЭтотОбъект);
+
+ КоллекцияФайловПараметров = Новый ПроцессорКоллекций;
+ КоллекцияФайловПараметров.УстановитьКоллекцию(ИндексКаталоговПоиска);
+
+ КоличествоФайлов = КоллекцияФайловПараметров
+ .Сортировать(ФункцияСортировки)
+ .Фильтровать("Результат = Элемент.ПоискФайла()")
+ .Количество();
+
+ Если КоличествоФайлов = 0 Тогда
+
+ Возврат;
+
+ ИначеЕсли ЧитатьТолькоОдинФайл
+ ИЛИ КоличествоФайлов = 1 Тогда
+
+ КаталогПоискаФайла = КоллекцияФайловПараметров.ПолучитьПервый();
+ ВыполнитьЧтениеФайловогоПровайдера(КаталогПоискаФайла.ИмяФайла());
+
+ Иначе
+
+ ФункцияОбработки = Новый ОписаниеОповещения("ОбработчикВыполненияЧтениеФайловогоПровайдера", ЭтотОбъект);
+ КоллекцияФайловПараметров.ДляКаждого(ФункцияОбработки);
+
+ КонецЕсли;
+
+ ОбработатьШаблонныеПодстановки(РезультатЧтения);
+
+КонецПроцедуры
+
+Процедура СформироватьИндексКаталогПоиска()
+
+ Для ИИ = 0 По КаталогиПоиска.ВГраница() Цикл
+
+ Для каждого РасширениеФайла Из РасширенияФайлаПараметров Цикл
+
+ Для каждого НаименованиеФайла Из НаименованияФайлаПараметров Цикл
+
+ ДобавитьКаталогПоискаВИндекс(КаталогиПоиска[ИИ], ИИ, НаименованиеФайла, РасширениеФайла);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ВыполнитьЧтениеФайловогоПровайдера(Знач ИмяФайлаПараметров)
+
+ РезультатЧтенияФайла = ВыполнитьЧтениеПровайдера(ИмяФайлаПараметров);
+
+ ОбработатьПараметрыРекурсивно(РезультатЧтенияФайла, ИмяФайлаПараметров);
+
+ ОбъединитьРезультаты(РезультатЧтения, РезультатЧтенияФайла);
+
+КонецПроцедуры
+
+Функция ВыполнитьЧтениеПровайдера(Знач ИмяФайлаПараметров)
+
+ НастройкаПровайдераДляТекущегоЧтения = СкопироватьСтруктуру(НастройкиПровайдера);
+ НастройкаПровайдераДляТекущегоЧтения.Вставить("ФайлПараметров", ИмяФайлаПараметров);
+
+ РезультатЧтенияФайла = КлассПровайдера.ПрочитатьПараметры(НастройкаПровайдераДляТекущегоЧтения);
+
+ Возврат РезультатЧтенияФайла;
+
+КонецФункции
+
+// Обработчик сортировки каталогов поиска файлов
+//
+// Параметры:
+// Результат - Объект.КаталогПоискаФайла - Элемент массива каталогов поиска
+// ДополнительныеПараметры - Структура - дополнительная структура
+//
+Процедура СортироватьКаталогиПоискаФайлов(Результат, ДополнительныеПараметры) Экспорт
+
+ Если ВРЕГ(НаправлениеСортировки) = ВРег("УБЫВ") Тогда
+ Результат = ДополнительныеПараметры.Элемент1.Приоритет() < ДополнительныеПараметры.Элемент2.Приоритет();
+ Иначе
+ Результат = ДополнительныеПараметры.Элемент1.Приоритет() > ДополнительныеПараметры.Элемент2.Приоритет();
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Обработчик выполнения чтения файлового провайдера
+//
+// Параметры:
+// Результат - Объект.КаталогПоискаФайла - Элемент массива каталогов поиска
+// ДополнительныеПараметры - Структура - дополнительная структура
+//
+Процедура ОбработчикВыполненияЧтениеФайловогоПровайдера(Результат, ДополнительныеПараметры) Экспорт
+
+ КаталогПоиска = ДополнительныеПараметры.Элемент;
+
+ ВыполнитьЧтениеФайловогоПровайдера(КаталогПоиска.ИмяФайла());
+
+КонецПроцедуры
+
+Процедура ОбъединитьРезультаты(ОсновноеСоответствие, ДобавляемоеСоответствие)
+
+ Для каждого Элемент Из ДобавляемоеСоответствие Цикл
+ ОсновноеСоответствие.Вставить(Элемент.Ключ, Элемент.Значение);
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция СкопироватьМассив(ВходящийМассив)
+
+ НовыйМассив = Новый Массив;
+
+ Для каждого Элемент Из ВходящийМассив Цикл
+ НовыйМассив.Добавить(Элемент);
+ КонецЦикла;
+
+ Возврат НовыйМассив;
+
+КонецФункции
+
+Функция СкопироватьСтруктуру(ВходящаяСтруктура)
+ НоваяСтруктура = Новый Структура;
+
+ Для каждого КлючЗначение Из ВходящаяСтруктура Цикл
+ НоваяСтруктура.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);
+ КонецЦикла;
+
+ Возврат НоваяСтруктура;
+КонецФункции
+
+Процедура ПрочитатьНастройки(Знач НастройкиПровайдера)
+
+ Если НастройкиПровайдера.Свойство("РасширенияФайлаПараметров")
+ И НастройкиПровайдера.РасширенияФайлаПараметров.Количество() > 0 Тогда
+ РасширенияФайлаПараметров = НастройкиПровайдера.РасширенияФайлаПараметров;
+ КонецЕсли;
+
+ Если НастройкиПровайдера.Свойство("НаименованияФайлаПараметров") Тогда
+ НаименованияФайлаПараметров = НастройкиПровайдера.НаименованияФайлаПараметров;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(НастройкиПровайдера.ПутьКФайлуПараметров) Тогда
+ ПутьКФайлуПараметров = НастройкиПровайдера.ПутьКФайлуПараметров;
+ КонецЕсли;
+
+ ЧитатьТолькоОдинФайл = НастройкиПровайдера.ЧитатьТолькоОдинФайл;
+
+ ДополнительныеКаталогиПоиска = НастройкиПровайдера.КаталогиПоиска;
+ КаталогиПоиска = СкопироватьМассив(ДополнительныеКаталогиПоиска);
+
+ ВложенныйКаталог = НастройкиПровайдера.ВложенныйКаталог;
+
+ Если ЗначениеЗаполнено(ВложенныйКаталог) Тогда
+ Для каждого Каталог Из КаталогиПоиска Цикл
+ Каталог = ОбъединитьПути(Каталог, ВложенныйКаталог);
+ КонецЦикла;
+ КонецЕсли;
+
+ УстановитьНаправлениеСортировки(НастройкиПровайдера.НаправлениеСортировки);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Чтение_вложенных_файлов
+
+Процедура ОбработатьПараметрыРекурсивно(Источник, Знач ИмяФайлаПараметров)
+
+ ПрефиксПараметрФайл = ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек;
+
+ ПутьКаталогаФайла = Новый Файл(ИмяФайлаПараметров).Путь;
+
+ КлючиКДополнительномуЧтению = Новый Массив;
+
+ Для каждого КлючЗначение Из Источник Цикл
+
+ Ключ = КлючЗначение.Ключ;
+ Значение = КлючЗначение.Значение;
+
+ Если ТипЗнч(Значение) = Тип("Соответствие") Тогда
+
+ ОбработатьПараметрыРекурсивно(Значение, ИмяФайлаПараметров);
+
+ Иначе
+ Лог.Отладка("Ищю ключ чтения файла: <%1>", Ключ);
+ Если СтрНачинаетсяС( ВРег(Ключ), ВРег(ПрефиксПараметрФайл)) Тогда
+ КлючиКДополнительномуЧтению.Добавить(Ключ);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Для каждого Ключ Из КлючиКДополнительномуЧтению Цикл
+
+ ПутьКФайлу = Источник[Ключ];
+
+ ПрочитатьФайлИзЗначенияПараметра(Ключ, ПутьКФайлу, ПутьКаталогаФайла, Источник);
+
+ Источник.Удалить(Ключ);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ПрочитатьФайлИзЗначенияПараметра(Знач Ключ, Знач ПутьКФайлу, Знач ПутьКаталогаФайла, Приемник)
+
+ Лог.Отладка("Нашли ключ файла <%1>, значение <%2>, путь каталога-родителя <%3>",
+ Ключ,
+ ПутьКФайлу,
+ ПутьКаталогаФайла);
+
+ ПутьФайла = ОбъединитьПути(ПутьКаталогаФайла, ПутьКФайлу);
+ Параметры = ВыполнитьЧтениеПровайдера(ПутьФайла);
+
+ ОбработатьПараметрыРекурсивно(Параметры, ПутьКаталогаФайла);
+
+ Для каждого КлючЗначение Из Параметры Цикл
+
+ Ключ = КлючЗначение.Ключ;
+ Значение = КлючЗначение.Значение;
+
+ Приемник.Вставить(Ключ, Значение);
+
+ КонецЦикла;
+
+КонецПроцедуры // ПрочитатьФайлИзЗначенияПараметра( Ключ, Значение, ПутьКаталогаФайла, Приемник)
+
+Процедура ОбработатьШаблонныеПодстановки(Параметры)
+
+ РегулярноеВыражение = Новый РегулярноеВыражение( "%([^%]*)%" );
+
+ КоличествоПопыток = 5;
+
+ Для Счетчик = 1 По КоличествоПопыток Цикл
+
+ МассивПодстановок = Новый Массив;
+
+ НайтиШаблонныеПодстановки(Параметры, МассивПодстановок, РегулярноеВыражение);
+
+ Если НЕ ЗначениеЗаполнено(МассивПодстановок) Тогда
+ Прервать;
+ КонецЕсли;
+
+ ВыполнитьПодстановки(МассивПодстановок);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура НайтиШаблонныеПодстановки(Параметры, Знач МассивПодстановок, Знач РегулярноеВыражение)
+
+ Для каждого КлючЗначение Из Параметры Цикл
+ Значение = КлючЗначение.Значение;
+ Тип = ТипЗнч(Значение);
+ Если Тип = Тип("Строка") Тогда
+ КоллекцияСовпадений = РегулярноеВыражение.НайтиСовпадения( Значение );
+ Если КоллекцияСовпадений.Количество() > 0 Тогда
+ Описание = Новый Структура("Ключ, Параметры", КлючЗначение.Ключ, Параметры);
+ Описание.Вставить("КоллекцияСовпадений", КоллекцияСовпадений);
+ МассивПодстановок.Добавить(Описание);
+
+ Лог.Отладка("Нашли значение для подстановки <%1>", Значение);
+ КонецЕсли;
+
+ ИначеЕсли Тип = Тип("Соответствие") Тогда
+ НайтиШаблонныеПодстановки(Значение, МассивПодстановок, РегулярноеВыражение);
+ КонецЕсли;
+
+ КонецЦикла;
+КонецПроцедуры
+
+Процедура ВыполнитьПодстановки(МассивПодстановок)
+
+ Для каждого ОписаниеПодстановки Из МассивПодстановок Цикл
+ КлючПодстановки = ОписаниеПодстановки.Ключ;
+
+ КоллекцияСовпадений = ОписаниеПодстановки.КоллекцияСовпадений;
+ Для каждого Совпадение Из КоллекцияСовпадений Цикл
+ Значение = Совпадение.Значение;
+ ИмяКлюча = Совпадение.Группы[1].Значение;
+ Лог.Отладка("Нашли имя ключа <%1> для возможной подстановки в <%2>", ИмяКлюча, Значение);
+
+ ЗначениеПоКлючу = ПолучитьЗначениеКлюча(ИмяКлюча);
+ Если ЗначениеПоКлючу <> Неопределено Тогда
+
+ Параметры = ОписаниеПодстановки.Параметры;
+ ЗначениеИзПараметров = Параметры[КлючПодстановки];
+ ИтоговоеЗначение = СтрЗаменить(ЗначениеИзПараметров, Значение, ЗначениеПоКлючу);
+
+ Параметры.Вставить(КлючПодстановки, ИтоговоеЗначение);
+ КонецЕсли;
+ КонецЦикла;
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ПолучитьЗначениеКлюча(ИмяКлюча)
+
+ МассивКлючей = СтрРазделить(ИмяКлюча, ".", Ложь);
+
+ ЗначениеКлюча = Неопределено;
+
+ ПервыйПроход = Истина;
+
+ Для каждого Ключ Из МассивКлючей Цикл
+
+ Если ПервыйПроход Тогда
+ ЗначениеКлюча = РезультатЧтения[Ключ];
+ ПервыйПроход = Ложь;
+ Иначе
+ ЗначениеКлюча = ЗначениеКлюча[Ключ];
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат ЗначениеКлюча;
+
+КонецФункции
+
+#КонецОбласти
+
+Процедура ПриСозданииОбъекта(Знач ВходящийКлассПровайдера)
+
+ ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек = "ReadFile";
+
+ РасширенияФайлаПараметров = Новый Массив;
+ НаименованияФайлаПараметров = Новый Массив;
+ КаталогиПоиска = Новый Массив;
+
+ ИнтерфейсФайловогоПровайдера = Новый ИнтерфейсОбъекта;
+ ИнтерфейсФайловогоПровайдера.Ф("РасширенияФайлов");
+
+ РефлекторОбъекта = Новый РефлекторОбъекта(ВходящийКлассПровайдера);
+
+ ПроверкаПровайдера = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсФайловогоПровайдера);
+
+ Если НЕ ПроверкаПровайдера Тогда
+ // TODO: Добавить описание того что реализовано, а что нет
+ ВызватьИсключение "Не реализован необходимый интерфейс провайдера";
+ КонецЕсли;
+
+ КлассПровайдера = ВходящийКлассПровайдера;
+
+ ЧитатьТолькоОдинФайл = Истина;
+
+ НаправлениеСортировки = "ВОЗР";
+
+ РасширенияФайлаПараметров = КлассПровайдера.РасширенияФайлов();
+
+ Если ТипЗнч(РасширенияФайлаПараметров) = Тип("Строка") Тогда
+ РасширенияФайлаПараметров = СтрРазделить(РасширенияФайлаПараметров, " ", Ложь);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.file_provider");
\ No newline at end of file
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\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..67a6be8
--- /dev/null
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -0,0 +1,788 @@
+#Использовать logos
+#Использовать reflector
+#Использовать "./internal"
+
+Перем Лог;
+
+Перем Настройки; // Соответствие
+Перем НаименованиеПараметров; // Строка
+Перем СинонимыПараметров; // Массив строка
+Перем ИндексПолей; // Соответствие ключа и типа элемента массива
+Перем ИндексСинонимовПолей; // Соответствие синонимов полей и наименования полей
+Перем ИндексПараметров; // Соответствие текущий настроек
+Перем КонструкторИспользован; // Булево, признак использования объекта при чтении из соответсвтия
+Перем ИнтерфейсКонструктора; // Класс объект ИнтерфейсОбъекта
+Перем МожетСодержатьПроизвольныеПоля; // Булево, признак возможность не указывать поля
+
+#Область Работа_с_конструктором_параметров
+
+// Создает и возвращает новый экземпляр конструктора параметров
+//
+// Параметры:
+// НовоеНаименованиеПараметров - Строка - наименование конструктора параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на новый элемент класса <КонструкторПараметров>
+//
+Функция НовыеПараметры(Знач НовоеНаименованиеПараметров) Экспорт
+
+ НовыйЭлемент = Новый КонструкторПараметров(ИндексПараметров, НовоеНаименованиеПараметров);
+
+ Возврат НовыйЭлемент;
+
+КонецФункции
+
+// Возвращает текущее наименование параметров
+//
+// Возвращаемое значение:
+// Строка - текущее наименование параметров
+//
+Функция ПолучитьНаименованиеПараметров() Экспорт
+
+ Возврат НаименованиеПараметров;
+
+КонецФункции
+
+// (Заготовка) Устанавливает дополнительное наименование узла параметров
+//
+// Параметры:
+// НовоеСинонимыПараметров - Строка - дополнительное наименование параметров в файле
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция НаименованиеУзла(Знач НовоеСинонимыПараметров) Экспорт
+
+ СинонимыПараметров = НовоеСинонимыПараметров;
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Устанавливает новое наименование параметров
+//
+// Параметры:
+// НовоеНаименованиеПараметров - Строка - новое наименование текущего класса параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция Наименование(НовоеНаименованиеПараметров) Экспорт
+
+ НаименованиеПараметров = НовоеНаименованиеПараметров;
+
+ ИндексПараметров.Вставить(НаименованиеПараметров, ЭтотОбъект);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Выполняет заполнение описания параметров из произвольного объекта
+//
+// Параметры:
+// КлассОбъект - Объект - произвольный класс, реализуемый интерфейс Конструктора
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция ИзКласса(КлассОбъект) Экспорт
+
+ НовоеНаименованиеПараметров = Строка(ТипЗнч(КлассОбъект));
+
+ РефлекторОбъекта = Новый РефлекторОбъекта(КлассОбъект);
+ РезультатПроверки = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсКонструктора);
+
+ Если Не РезультатПроверки Тогда
+ ВызватьИсключение СтрШаблон("Класс <%1> не реализовывает интерфейс <%2>", КлассОбъект, ИнтерфейсКонструктора);
+ КонецЕсли;
+
+ Если РефлекторОбъекта.ЕстьФункция("ПолучитьНаименованиеПараметров") Тогда
+ НовоеНаименованиеПараметров = КлассОбъект.ПолучитьНаименованиеПараметров();
+ КонецЕсли;
+
+ Наименование(НовоеНаименованиеПараметров);
+
+ КлассОбъект.ОписаниеПараметров(ЭтотОбъект);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Копирует текущий конструктор параметров
+//
+// Параметры:
+// НовоеНаименованиеПараметров - Строка - наименование конструктора в индексе параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция Скопировать(Знач НовоеНаименованиеПараметров = Неопределено) Экспорт
+
+ НовыйЭлемент = Новый КонструкторПараметров(ИндексПараметров, НовоеНаименованиеПараметров);
+
+ СкопироватьПоля(НовыйЭлемент);
+
+ Возврат НовыйЭлемент;
+
+КонецФункции
+
+// Устанавливает признак содержания произвольных полей конструктора параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция ПроизвольныеПоля() Экспорт
+ МожетСодержатьПроизвольныеПоля = Истина;
+ Возврат ЭтотОбъект;
+КонецФункции
+
+#КонецОбласти
+
+#Область Работа_с_текущем_полем_настройки
+
+// Создает и возвращает новое поле-строка конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ТипЭлемента - Строка - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеМассив(Знач ИмяПоля, Знач ТипЭлемента) Экспорт
+
+ Лог.Отладка("Добавляю поле <%1> тип <%2> ТипЭлементов <%3>", ИмяПоля, Тип("Массив"), ТипЭлемента);
+
+ ОбъектПоля = Неопределено;
+
+ Если ТипЗнч(ТипЭлемента) = Тип("КонструкторПараметров") Тогда
+ ОбъектПоля = ТипЭлемента;
+ ТипЭлемента = Тип("КонструкторПараметров");
+ КонецЕсли;
+
+ Возврат Поле(ИмяПоля, Тип("Массив"), Новый Массив, ТипЭлемента, ОбъектПоля);
+
+КонецФункции
+
+// Создает и возвращает новое поле-строка конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - строка - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеСтрока(Знач ИмяПоля, ЗначениеПоУмолчанию = "") Экспорт
+
+ Возврат Поле(ИмяПоля, Тип("Строка"), ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-число конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Число - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеЧисло(Знач ИмяПоля, ЗначениеПоУмолчанию = 0) Экспорт
+
+ Возврат Поле(ИмяПоля, Тип("Число"), ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-дата конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Дата - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеДата(Знач ИмяПоля, ЗначениеПоУмолчанию = Неопределено) Экспорт
+
+ Если Не ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
+ ЗначениеПоУмолчанию = Дата("00010101");
+ КонецЕсли;
+
+ Возврат Поле(ИмяПоля, Тип("Дата"), ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-булево конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ЗначениеПоУмолчанию - Булево - значение поля по умолчанию
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеБулево(Знач ИмяПоля, ЗначениеПоУмолчанию = Ложь) Экспорт
+
+ Возврат Поле(ИмяПоля, Тип("Булево"), ЗначениеПоУмолчанию);
+
+КонецФункции
+
+// Создает и возвращает новое поле-объект конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ОбъектПоля - Объект.КонструкторПараметров - ссылка на объект поле
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция ПолеОбъект(Знач ИмяПоля, Знач ОбъектПоля) Экспорт
+
+ ТипПоля = Тип("КонструкторПараметров");
+
+ Если Тип("ПолеКонструктораПараметров") = ТипЗнч(ОбъектПоля) Тогда
+
+ ОбъектПоля = ОбъектПоля.Конструктор();
+
+ ИначеЕсли НЕ Тип("КонструкторПараметров") = ТипЗнч(ОбъектПоля) Тогда
+
+ ОбъектПоля = ПолучитьПолеПараметров(ОбъектПоля);
+
+ КонецЕсли;
+
+ Лог.Отладка("Добавляю поле объект <%1>, <%2>, <%3>", ИмяПоля, ТипПоля, ОбъектПоля.ПолучитьНаименованиеПараметров());
+
+ Возврат Поле(ИмяПоля, ТипПоля, , , ОбъектПоля);
+
+КонецФункции
+
+// Создает и возвращает новое поле конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача нескольких через пробел.
+// ТипПоля - ОписаниеТипов - тип создаваемого поля
+// ЗначениеПоУмолчанию - Строка, Число, Дата, Неопределено - значение по умолчанию для поля
+// ТипЭлемента - ОписаниеТипов - тип для элементов поля массив
+// ОбъектПоля - Объект.КонструкторПараметров - ссылка на объект поле
+//
+// Возвращаемое значение:
+// Объект.ПолеКонструктораПараметров - ссылка на текущий элемент класса <ПолеКонструктораПараметров>
+//
+Функция Поле(Знач ИмяПоля,
+ Знач ТипПоля = Неопределено,
+ Знач ЗначениеПоУмолчанию = Неопределено,
+ Знач ТипЭлемента = Неопределено,
+ Знач ОбъектПоля = Неопределено) Экспорт
+
+ Если ТипПоля = Неопределено
+ И ЗначениеПоУмолчанию = Неопределено Тогда
+ ТипПоля = Тип("Строка");
+ КонецЕсли;
+
+ Если ТипПоля = Неопределено
+ И Не ЗначениеПоУмолчанию = Неопределено Тогда
+ ТипПоля = ТипЗнч(ЗначениеПоУмолчанию);
+ КонецЕсли;
+
+ НовоеПолеПараметров = Новый ПолеКонструктораПараметров(ЭтотОбъект,
+ ИмяПоля,
+ ТипПоля,
+ ТипЭлемента,
+ ОбъектПоля);
+
+ ДобавитьПолеВИндекс(НовоеПолеПараметров);
+ НовоеПолеПараметров.УстановитьЗначение(ЗначениеПоУмолчанию);
+
+ Настройки.Вставить(НовоеПолеПараметров.Имя, ЗначениеПоУмолчанию);
+
+ Возврат НовоеПолеПараметров;
+
+КонецФункции
+
+// Удаляет поле из конструктора параметров
+//
+// Параметры:
+// ИмяПоля - Строка - имя поля, возможно передача синонима поля.
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий элемент класса <КонструкторПараметров>
+//
+Функция УдалитьПоле(Знач ИмяПоля) Экспорт
+
+ УдаляемоеПоле = ИндексСинонимовПолей[ИмяПоля];
+
+ Если УдаляемоеПоле = Неопределено Тогда
+ Возврат ЭтотОбъект;
+ КонецЕсли;
+
+ ИндексПолей.Удалить(УдаляемоеПоле);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Возвращает индекс полей конструктора параметров
+//
+// Возвращаемое значение:
+// Соответствие - текущий индекс полей
+//
+Функция ПолучитьИндексПолей() Экспорт
+
+ Возврат ИндексПолей;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Работа_с_чтением_и_выгрузкой_параметров
+
+// Преобразовывает структуру параметров в структуру
+//
+// Возвращаемое значение:
+// Структура - значение параметров в структуре
+//
+Функция ВСтруктуру() Экспорт
+
+ ИсходящаяСтруктура = Новый Структура;
+
+ Если МожетСодержатьПроизвольныеПоля Тогда
+ Возврат ВСоответствие();
+ КонецЕсли;
+
+ Для каждого КлючЗначение Из Настройки Цикл
+
+ Значение = КлючЗначение.Значение;
+
+ ЗначениеКлюча = ЗначениеВСтруктуру(Значение);
+
+ ИсходящаяСтруктура.Вставить(КлючЗначение.Ключ, ЗначениеКлюча);
+
+ КонецЦикла;
+
+ Возврат ИсходящаяСтруктура;
+
+КонецФункции
+
+// Преобразовывает структуру параметров в соответствие
+//
+// Возвращаемое значение:
+// Соответствие - значение параметров в соответствии
+//
+Функция ВСоответствие() Экспорт
+
+ СоответствиеРезультат = Новый Соответствие;
+
+ Для каждого КлючЗначение Из Настройки Цикл
+
+ Значение = КлючЗначение.Значение;
+
+ ЗначениеКлюча = ЗначениеВСоответствие(Значение);
+
+ СоответствиеРезультат.Вставить(КлючЗначение.Ключ, ЗначениеКлюча);
+
+ КонецЦикла;
+
+ Возврат СоответствиеРезультат;
+
+КонецФункции
+
+// (Заготовка) Выполняет чтение значений параметров из структуры
+//
+// Параметры:
+// ВходящаяСтруктура - Структура - структура со значениями параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий объект <КонструкторПараметров>
+//
+Функция ИзСтруктуры(Знач ВходящаяСтруктура) Экспорт
+
+ Лог.Информация("Данная функция не реализована. Количество элементов в структуре <%1>", ВходящаяСтруктура.Количество());
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Выполняет чтение значений параметров из соответствия
+//
+// Параметры:
+// ВходящиеСоответствие - Соответствия - соответствие со значениями параметров
+//
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на текущий объект <КонструкторПараметров>
+//
+Функция ИзСоответствия(Знач ВходящиеСоответствие) Экспорт
+
+ КонструкторИспользован = Истина;
+
+ Лог.Отладка("Читаю настройки <%1>", НаименованиеПараметров);
+
+ ПрочитатьИзСоответствия(ВходящиеСоответствие);
+
+ ПоказатьНастройкиВРежимеОтладки(Настройки);
+
+ Возврат ЭтотОбъект;
+
+КонецФункции
+
+// Возвращает признак использования объекта при конвертации из соответствия
+//
+// Возвращаемое значение:
+// Булево - признак использования объекта при конвертации из соответствия
+//
+Функция Использован() Экспорт
+ Возврат КонструкторИспользован;
+КонецФункции
+
+#КонецОбласти
+
+#Область Вспомогательные_процедуры_и_функции
+
+// Добавляет синонимы поля в индекс полей
+//
+// Параметры:
+// ПолеПараметров - Объект.ПолеКонструктораПараметров - класс <ПолеКонструктораПараметров> для чтения синонимов
+//
+Процедура ДобавитьСинонимыПоляВИндекс(Знач ПолеПараметров) Экспорт
+
+ ИмяПоля = ПолеПараметров.Имя;
+
+ Для каждого Синоним Из ПолеПараметров.Синонимы Цикл
+ Лог.Отладка("Добавляю в индекс синоним <%1> для поля <%2>", Синоним, ИмяПоля);
+ ИндексСинонимовПолей.Вставить(Синоним, ИмяПоля);
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция НайтиПолеВИндексеПолей(Знач ИмяПоля)
+
+ ИмяПоляВИндексе = ИндексСинонимовПолей[ИмяПоля];
+
+ Лог.Отладка("Получено поля <%1> (<%2>)", ИмяПоляВИндексе, ИмяПоля);
+
+ Если ИмяПоляВИндексе = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Возврат ИндексПолей[ИмяПоляВИндексе];
+
+КонецФункции
+
+Процедура СкопироватьПоля(НовыйЭлемент)
+
+ Для каждого ПолеПараметра Из ИндексПолей Цикл
+
+ КлассПоля = ПолеПараметра.Значение;
+
+ ОписаниеПоля = КлассПоля.ОписаниеПоля();
+
+ НовыйЭлемент.Поле(ОписаниеПоля.Имя,
+ ОписаниеПоля.Тип,
+ ОписаниеПоля.ЗначениеПоУмолчанию,
+ ОписаниеПоля.ТипЭлемента,
+ ОписаниеПоля.ТипЭлемента
+ );
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьПолеВИндекс(ПолеПараметров)
+
+ ИндексПолей.Вставить(ПолеПараметров.Имя, ПолеПараметров);
+
+ ДобавитьСинонимыПоляВИндекс(ПолеПараметров);
+
+КонецПроцедуры
+
+Функция ПолучитьПолеПараметров(КлассОбъект)
+
+ ИмяПараметров = Строка(ТипЗнч(КлассОбъект));
+
+ РефлекторОбъекта = Новый РефлекторОбъекта(КлассОбъект);
+
+ РезультатПроверки = РефлекторОбъекта.РеализуетИнтерфейс(ИнтерфейсКонструктора);
+
+ Если Не РезультатПроверки Тогда
+ ВызватьИсключение СтрШаблон("Класс <%1> не реализовывает интерфейс <%2>", КлассОбъект, ИнтерфейсКонструктора);
+ КонецЕсли;
+
+ Если РефлекторОбъекта.ЕстьФункция("ПолучитьНаименованиеПараметров") Тогда
+ ИмяПараметров = КлассОбъект.ПолучитьНаименованиеПараметров();
+ КонецЕсли;
+
+ Если ПараметрЕстьВИндексе(ИмяПараметров) Тогда
+ Возврат ИндексПараметров[ИмяПараметров];
+ КонецЕсли;
+
+ КонструкторПараметровКласса = НовыеПараметры(ИмяПараметров);
+
+ КлассОбъект.ОписаниеПараметров(КонструкторПараметровКласса);
+
+ Возврат КонструкторПараметровКласса;
+
+КонецФункции
+
+Функция ПараметрЕстьВИндексе(Знач ИмяПараметров)
+ Возврат НЕ ИндексПараметров[ИмяПараметров] = Неопределено;
+КонецФункции
+
+Функция ЗначениеВСоответствие(Значение)
+
+ ТипЗначения = ТипЗнч(Значение);
+
+ Если ТипЗначения = Тип("Массив") Тогда
+
+ МассивЗначений = Новый Массив;
+
+ Для Каждого ЭлМассива Из Значение Цикл
+
+ МассивЗначений.Добавить(ЗначениеВСоответствие(ЭлМассива));
+
+ КонецЦикла;
+
+ Возврат МассивЗначений;
+
+ ИначеЕсли ТипЗначения = Тип("КонструкторПараметров") Тогда
+
+ Возврат Значение.ВСоответствие();
+
+ Иначе
+
+ Возврат Значение;
+
+ КонецЕсли;
+
+КонецФункции
+
+Функция ЗначениеВСтруктуру(Значение)
+
+ ТипЗначения = ТипЗнч(Значение);
+
+ Если ТипЗначения = Тип("Массив") Тогда
+
+ МассивЗначений = Новый Массив;
+
+ Для Каждого ЭлМассива Из Значение Цикл
+
+ МассивЗначений.Добавить(ЗначениеВСтруктуру(ЭлМассива));
+
+ КонецЦикла;
+
+ Возврат МассивЗначений;
+
+ ИначеЕсли ТипЗначения = Тип("КонструкторПараметров") Тогда
+
+ Возврат Значение.ВСтруктуру();
+
+ Иначе
+
+ Возврат Значение;
+
+ КонецЕсли;
+
+КонецФункции
+
+Процедура ПрочитатьИзСоответствия(Знач ВходящиеСоответствие)
+
+ Для каждого КлючЗначение Из ВходящиеСоответствие Цикл
+
+ ИмяКлюча = КлючЗначение.Ключ;
+ Значение = КлючЗначение.Значение;
+ Лог.Отладка("Загружаю поле <%1>, <%2>", ИмяКлюча, Значение);
+
+ ПолеПараметров = НайтиПолеВИндексеПолей(ИмяКлюча);
+
+ Если ПолеПараметров = Неопределено Тогда
+
+ Если МожетСодержатьПроизвольныеПоля Тогда
+ Настройки.Вставить(ИмяКлюча, Значение);
+ КонецЕсли;
+
+ Продолжить;
+
+ КонецЕсли;
+
+ ЗначениеПараметра = ПреобразоватьЗначение(Значение, ПолеПараметров);
+
+ ПолеПараметров.УстановитьЗначение(ЗначениеПараметра);
+
+ ДобавитьВНастройкуЗначение(ПолеПараметров, ЗначениеПараметра);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьВНастройкуЗначение(ПолеПараметров, ЗначениеПараметра, ВключаяСинонимы = Ложь)
+
+ Если ВключаяСинонимы Тогда
+
+ Для каждого Синоним Из ПолеПараметров.Синонимы Цикл
+
+ Настройки.Вставить(Синоним, ЗначениеПараметра);
+
+ КонецЦикла;
+ Иначе
+
+ Настройки.Вставить(ПолеПараметров.Имя, ЗначениеПараметра);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ПреобразоватьЗначение(Значение, ПолеПараметров, ТипЗначения = Неопределено)
+
+ Если ТипЗначения = Неопределено Тогда
+
+ ТипЗначения = ПолеПараметров.Тип;
+
+ КонецЕсли;
+
+ Лог.Отладка("Тип значение <%1>
+ | Тип значения из поля: <%2>
+ | Тип значения: <%3>", ТипЗначения, ПолеПараметров.Тип, ТипЗнч(Значение));
+
+ Если ТипЗначения = Тип("Строка") Тогда
+
+ Возврат ?(ТипЗнч(Значение) = Тип("Строка"), Значение, Строка(Значение));
+
+ ИначеЕсли ТипЗначения = Тип("Дата") Тогда
+
+ Если ТипЗнч(Значение) = Тип("Дата") Тогда
+ Возврат Значение;
+ КонецЕсли;
+
+ Возврат СтрокаВДату(Значение);
+
+ ИначеЕсли ТипЗначения = Тип("Число") Тогда
+
+ Возврат Число(Значение);
+
+ ИначеЕсли ТипЗначения = Тип("Булево") Тогда
+
+ Возврат ?(ТипЗнч(Значение) = Тип("Булево"), Значение, Булево(Значение));
+
+ ИначеЕсли ТипЗначения = Тип("Массив") Тогда
+
+ Возврат ПреобразоватьМассив(Значение, ПолеПараметров);
+
+ ИначеЕсли ТипЗначения = Тип("КонструкторПараметров") Тогда
+
+ Возврат ПолеПараметров.ИзСоответствия(Значение);
+
+ Иначе
+
+ ВызватьИсключение СтрШаблон("Не правильный тип настройки поля <%1>", Строка(ТипЗначения));
+
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПреобразоватьМассив(ВходящийМассив, ПолеПараметров)
+
+ МассивЗначений = Новый Массив;
+ ТипЭлементовМассива = ПолеПараметров.ТипЭлемента;
+
+ Лог.Отладка("Обрабатываю массив количество <%1> ", ВходящийМассив.Количество());
+
+ Для каждого ЭлементМассива Из ВходящийМассив Цикл
+
+ МассивЗначений.Добавить(ПреобразоватьЗначение(ЭлементМассива, ПолеПараметров, ТипЭлементовМассива));
+
+ КонецЦикла;
+
+ Возврат МассивЗначений;
+
+КонецФункции
+
+Процедура ПоказатьНастройкиВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "")
+
+ Если Родитель = "" Тогда
+ Лог.Отладка(" Тип параметров %1", ТипЗнч(ЗначенияПараметров));
+ КонецЕсли;
+
+ Если ЗначенияПараметров.Количество() = 0 Тогда
+ Лог.Отладка(" Коллекция параметров пуста!");
+ КонецЕсли;
+
+ Если ЗначенияПараметров = Тип("Массив") Тогда
+
+ Для ИИ = 0 По ЗначенияПараметров.ВГраница() Цикл
+ ПоказатьНастройкиВРежимеОтладки(ЗначенияПараметров[ИИ], СтрШаблон("%1.%2", Родитель, ИИ));
+ КонецЦикла;
+
+ ИначеЕсли ТипЗнч(ЗначенияПараметров) = Тип("Структура")
+ ИЛИ ТипЗнч(ЗначенияПараметров) = Тип("Соответствие") Тогда
+
+ Для каждого Элемент Из ЗначенияПараметров Цикл
+
+ Если Не ПустаяСтрока(Родитель) Тогда
+ ПредставлениеКлюча = СтрШаблон("%1.%2", Родитель, Элемент.Ключ);
+ Иначе
+ ПредставлениеКлюча = Элемент.Ключ;
+ КонецЕсли;
+
+ Если ТипЗнч(Элемент.Значение) = Тип("КонструкторПараметров") Тогда
+
+ ПоказатьНастройкиВРежимеОтладки(Элемент.Значение.ВСтруктуру(), ПредставлениеКлюча);
+
+ ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Структура")
+ ИЛИ ТипЗнч(Элемент.Значение) = Тип("Соответствие") Тогда
+
+ ПоказатьНастройкиВРежимеОтладки(Элемент.Значение, ПредставлениеКлюча);
+
+ Иначе
+ Лог.Отладка(" параметр <%1> = <%2>", ПредставлениеКлюча, Элемент.Значение);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПриСозданииОбъекта(ВходящийИндексПараметров, Знач НовоеНаименованиеПараметров)
+
+ НаименованиеПараметров = НовоеНаименованиеПараметров;
+ Настройки = Новый Соответствие;
+ ИндексПолей = Новый Соответствие;
+ ИндексСинонимовПолей = Новый Соответствие;
+ ИндексПараметров = ВходящийИндексПараметров;
+
+ Если ИндексПараметров = Неопределено Тогда
+ ИндексПараметров = Новый Соответствие;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(НаименованиеПараметров) Тогда
+ ИндексПараметров.Вставить(НаименованиеПараметров, ЭтотОбъект);
+ КонецЕсли;
+
+ КонструкторИспользован = Ложь;
+ МожетСодержатьПроизвольныеПоля = Ложь;
+
+ ИнтерфейсКонструктора = Новый ИнтерфейсОбъекта;
+ ИнтерфейсКонструктора.ПроцедураИнтерфейса("ОписаниеПараметров", 1);
+
+КонецПроцедуры
+
+// Процедура СтрокаВДату преобразует строку в дату по шаблону форматной строки
+Функция СтрокаВДату(Знач Значение)
+
+ // Поиск.
+ Попытка
+ Возврат Дата(Лев(Значение, 4) + Сред(Значение, 06, 2) + Сред(Значение, 09, 2) +
+ Сред(Значение, 12, 2) + Сред(Значение, 15, 2) + Сред(Значение, 18, 2));
+ Исключение
+ ВызватьИсключение ИсключениеНекорректныйФорматДаты(Значение);
+ КонецПопытки;
+КонецФункции
+
+Функция ИсключениеНекорректныйФорматДаты(Значение)
+
+ Возврат СтрШаблон("Некорректный формат даты [%1]", Значение);
+
+КонецФункции
+
+#КонецОбласти
+
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.constructor");
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
index 74b5783..8bad097 100644
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
+++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os"
@@ -1,36 +1,43 @@
#Использовать asserts
#Использовать logos
#Использовать tempfiles
+#Использовать reflector
+#Использовать fluent
+#Использовать notify
Перем ЧтениеПараметровВыполнено; // булево - флаг, что чтение выполнено
-Перем ИндексПараметров; // Соответствие - плоский индекс всех параметров
+Перем ИндексПараметров; // Класс ИндексЗначений - плоский индекс всех параметров
Перем ПрочитанныеПараметры; // Соответствие - результат чтения из провайдеров
-Перем КлассПриемникПараметров; // Произвольный класс обеспечивающий: Функция Параметры() Экспорт, Процедура УстановитьПараметры(НовыеПараметры) Экспорт
+Перем КлассПараметров; // Произвольный класс обеспечивающий: Функция Параметры() Экспорт, Процедура УстановитьПараметры(НовыеПараметры) Экспорт
-Перем ТаблицаПровайдеровПараметров; // ТаблицаЗначений Колонки: Имя, Класс, Приоритет, Настройки
+Перем ПровайдерыПараметров; // Соответствие
-Перем ИндексРазделовПараметров;
-Перем ОбщаяНастройка;
+Перем НастройкаФайловогоПровайдера; // Класс НастройкиФайловогоПровайдера
-Перем Лог;
+Перем ИнтерфейсПриемника; // Класс ИнтерфейсОбъекта
-#Область экспортных процедур
+Перем ВнутреннийКонструкторПараметров; // Класс КонструкторПараметров
+Перем ИспользуетсяКонструкторПараметров; // булево
-// Устанавливает класс приемник для выгрузки результата чтения параметров
+Перем Лог; // Логгер
+
+#Область Экспортных_процедур
+
+// Получает и возвращает значение из индекса параметров
//
// Параметры:
-// ИмяПараметра - строка - имя параметра
+// ИмяПараметра - Строка - имя параметра
// допустимо указание пути к параметру через точку (например, "config.server.protocol")
-// ЗначениеПоУмолчанию - произвольный - возвращаемое значение в случае отсутствия параметра после чтения
+// ЗначениеПоУмолчанию - Произвольный - возвращаемое значение в случае отсутствия параметра после чтения
//
// Возвращаемое значение:
-// Произвольный - значение параметра
+// Строка, Число, Булево, Массив, Соответствие, Неопределено - значение параметра
//
Функция Параметр(Знач ИмяПараметра, Знач ЗначениеПоУмолчанию = Неопределено) Экспорт
- ЗначениеИзИндекса = ИндексПараметров[ИмяПараметра];
+ ЗначениеИзИндекса = ИндексПараметров.Значение(ИмяПараметра);
Если НЕ ЗначениеИзИндекса = Неопределено Тогда
Возврат ЗначениеИзИндекса;
@@ -43,7 +50,7 @@
// Возвращает признак выполнения чтения параметров
//
// Возвращаемое значение:
-// булево - признак выполнения чтения параметров
+// Булево - признак выполнения чтения параметров
//
Функция ЧтениеВыполнено() Экспорт
Возврат ЧтениеПараметровВыполнено;
@@ -55,253 +62,287 @@
ИндексПараметров.Очистить();
ПрочитанныеПараметры.Очистить();
- ВыполнитьЧтениеПоТаблицеПровайдеров();
+ ВыполнитьЧтениеПровайдеров();
Лог.Отладка("ПрочитанныеПараметры количество <%1>", ПрочитанныеПараметры.Количество());
- ОбновитьИндексПараметров();
+ Если ИспользуетсяКонструкторПараметров Тогда
- ПоказатьПараметрыВРежимеОтладки(ПрочитанныеПараметры);
+ ВнутреннийКонструкторПараметров.ИзСоответствия(ПрочитанныеПараметры);
- ЧтениеПараметровВыполнено = ИндексПараметров.Количество() > 0;
+ ПараметрыДляИндекса = ВнутреннийКонструкторПараметров.ВСоответствие();
- Если Не КлассПриемникПараметров = Неопределено Тогда
- ВыгрузитьПараметрыВКлассПриемник();
+ Если Не КлассПараметров = Неопределено Тогда
+ ВыгрузитьПараметрыВКлассПриемник();
+ КонецЕсли;
+
+ Иначе
+ ПараметрыДляИндекса = ПрочитанныеПараметры;
КонецЕсли;
+ ИндексПараметров.Коллекция(ПараметрыДляИндекса);
+
+ ПоказатьПараметрыВРежимеОтладки(ПараметрыДляИндекса);
+
+ ЧтениеПараметровВыполнено = ПараметрыДляИндекса.Количество() > 0;
+
КонецПроцедуры
// Устанавливает путь к файлу параметров
//
// Параметры:
-// ПутьКФайлу - строка - полный путь к файлу параметров
+// ПутьКФайлу - Строка - полный путь к файлу параметров
//
Процедура УстановитьФайлПараметров(Знач ПутьКФайлу) Экспорт
- ОбщаяНастройка.Вставить("ФайлПараметров", ПутьКФайлу);
+ НастройкаФайловогоПровайдера = ПолучитьНастройкуФайловогоПровайдера();
+
+ НастройкаФайловогоПровайдера.УстановитьФайлПараметров(ПутьКФайлу);
КонецПроцедуры
-// Добавляет дополнительный путь к каталогу поиска файла параметров
+// Добавляет в таблицу провайдеров произвольный класс-провайдер
//
// Параметры:
-// ПутьПоискаФайлов - строка - полный путь к дополнительному каталогу для поиска файла параметров
+// КлассОбъект - Объект - класс провайдера или имя класса
+// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
//
-Процедура ДобавитьКаталогПоиска(Знач ПутьПоискаФайлов) Экспорт
+Процедура ДобавитьПровайдерПараметров(Знач КлассОбъект,
+ Знач Приоритет = Неопределено) Экспорт
- КаталогиПоиска = ОбщаяНастройка.КаталогиПоиска;
- КаталогиПоиска.Добавить(ПутьПоискаФайлов);
+ ДобавляемыйПровайдерПараметров = Новый ПровайдерПараметров(КлассОбъект);
-КонецПроцедуры
-
-// Добавляет имя файла параметров
-//
-// Параметры:
-// ИмяФайла - строка - имя файла параметров
-//
-Процедура УстановитьИмяФайла(Знач ИмяФайла) Экспорт
+ Если Не Приоритет = Неопределено Тогда
+ ДобавляемыйПровайдерПараметров.УстановитьПриоритет(Приоритет);
+ КонецЕсли;
- ОбщаяНастройка.Вставить("ИмяФайлаПараметров", ИмяФайла);
+ ПровайдерыПараметров.Вставить(ДобавляемыйПровайдерПараметров.Идентификатор, ДобавляемыйПровайдерПараметров);
КонецПроцедуры
-// Устанавливает расширение файла параметров
+// Отключает провайдера из таблицы провайдеров
//
// Параметры:
-// РасширениеФайла - строка - расширение файла параметров (например, .json/json)
+// ИдентификаторПровайдера - Строка - короткий идентификатор провайдера (например, json)
//
-Процедура УстановитьРасширениеФайла(Знач РасширениеФайла) Экспорт
+Процедура ОтключитьПровайдер(Знач ИдентификаторПровайдера) Экспорт
+
+ Провайдер = ПровайдерыПараметров[ИдентификаторПровайдера];
- Если Не СтрНачинаетсяС(РасширениеФайла, ".") Тогда
- РасширениеФайла = "."+РасширениеФайла;
+ Если Провайдер = Неопределено Тогда
+ Лог.Отладка("Провайдер с идентификатором <%1> не найден", ИдентификаторПровайдера);
+ Возврат;
КонецЕсли;
- ОбщаяНастройка.Вставить("РасширениеФайла", РасширениеФайла);
+ Провайдер.Отключить();
КонецПроцедуры
-// Устанавливает параметры для провайдера
+// Возвращает объект настройки поиска файлов
//
-// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
-// Параметры - структура - произвольная структура для передачи в провайдера
+// Возвращаемое значение:
+// Объект.НастройкаФайловогоПровайдера - внутренний класс по настройке файловых провайдеров
//
-Процедура УстановитьПараметрыПровайдера(Знач ИдентификаторПровайдера, Знач Параметры) Экспорт
+Функция НастройкаПоискаФайла() Экспорт
+ Возврат ПолучитьНастройкуФайловогоПровайдера();
+КонецФункции
- СтрокаПровайдера = НайтиПровайдераПоИдентификатору(ИдентификаторПровайдера);
- Если СтрокаПровайдера = Неопределено Тогда
- Лог.Отладка("Провайдер с идентификатором <%1> не найден", ИдентификаторПровайдера);
- Возврат;
- КонецЕсли;
+// Добавляет и включает встроенный провайдер JSON
+//
+// Параметры:
+// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 0)
+//
+Процедура ИспользоватьПровайдерJSON(Знач Приоритет = 0) Экспорт
- СтрокаПровайдера.Параметры = Параметры;
+ ДобавитьПровайдерПараметров(Новый ПровайдерПараметровJSON, Приоритет);
КонецПроцедуры
-// Очищает таблицу провайдеров и устанавливает произвольный класс-провайдер
+// Добавляет и включает встроенный провайдер YAML
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
-// Класс - Строка/Класс - класс провайдера или имя класса
-// Настройки - Струтура - произвольная структура передаваемая провайдеру в момент выполнения
-// Приоритет - число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+// Приоритет - Число - Числовой приоритет выполнения провайдеры (по умолчанию 0)
//
-Процедура УстановитьПроизвольныйПровайдерПараметров(Знач ИдентификаторПровайдера, Знач Класс, Знач Настройки = Неопределено, Знач Приоритет = 99) Экспорт
+Процедура ИспользоватьПровайдерYAML(Знач Приоритет = 0) Экспорт
- ТаблицаПровайдеровПараметров.Очистить();
-
- ДобавитьПровайдерПараметров(ИдентификаторПровайдера, Класс, Настройки, Приоритет);
+ ДобавитьПровайдерПараметров(Новый ПровайдерПараметровYAML, Приоритет);
КонецПроцедуры
-// Добавляет в таблицу провайдеров произвольный класс-провайдер
+// Производит автоматическую настройку провайдеров
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
-// Класс - Строка/Класс - класс провайдера или имя класса
-// Настройки - Струтура - произвольная структура передаваемая провайдеру в момент выполнения
-// Приоритет - число - Числовой приоритет выполнения провайдеры (по умолчанию 99)
+// НаименованиеФайла - Строка - Наименование файла параметров
+// ВложенныйПодкаталог - Строка - Дополнительный каталог, для стандартных путей
+// ИдентификаторыПровайдеров - Строка - Идентификаторы встроенных параметров, по умолчанию
//
-Процедура ДобавитьПровайдерПараметров(Знач ИдентификаторПровайдера, Знач Класс, Знач Настройки = Неопределено, Знач Приоритет = 99) Экспорт
+Процедура АвтоНастройка(Знач НаименованиеФайла,
+ Знач ВложенныйПодкаталог = Неопределено,
+ Знач ИдентификаторыПровайдеров = "yaml json") Экспорт
- НовыйПровайдер = ТаблицаПровайдеровПараметров.Добавить();
- НовыйПровайдер.Идентификатор = ИдентификаторПровайдера;
- НовыйПровайдер.Класс = Класс;
- Если Настройки = Неопределено Тогда
- Настройки = Новый Структура;
+ НастройкаФайловогоПровайдера = ПолучитьНастройкуФайловогоПровайдера();
+
+ НастройкаФайловогоПровайдера.УстановитьИмяФайла(НаименованиеФайла);
+ НастройкаФайловогоПровайдера.УстановитьСтандартныеКаталогиПоиска(ВложенныйПодкаталог);
+
+ МассивИдентификаторовПровайдеров = СтрРазделить(Врег(ИдентификаторыПровайдеров), " ");
+
+ ПровайдерYAML = МассивИдентификаторовПровайдеров.Найти("YAML");
+ Если НЕ ПровайдерYAML = Неопределено Тогда
+ ИспользоватьПровайдерYAML(ПровайдерYAML);
+ КонецЕсли;
+
+ ПровайдерJSON = МассивИдентификаторовПровайдеров.Найти("JSON");
+ Если НЕ ПровайдерJSON = Неопределено Тогда
+ ИспользоватьПровайдерJSON(ПровайдерJSON);
КонецЕсли;
- НовыйПровайдер.Настройки = Настройки;
- НовыйПровайдер.Приоритет = Приоритет;
КонецПроцедуры
-// Отключает и удаляет провайдера из таблицы провайдеров
+// Устанавливает класс параметров для описания конструктора параметров и установки результатов чтения
//
// Параметры:
-// ИдентификаторПровайдера - строка - короткий идентификатор провайдера (например, json)
+// КлассОбъект - Объект - произвольный класс, реализующий ряд экспортных процедур
//
-Процедура ОтключитьПровайдер(Знач ИдентификаторПровайдера) Экспорт
+Процедура УстановитьКлассПараметров(КлассОбъект) Экспорт
- СтрокаПровайдера = НайтиПровайдераПоИдентификатору(ИдентификаторПровайдера);
- Если СтрокаПровайдера = Неопределено Тогда
- Лог.Отладка("Провайдер с идентификатором <%1> не найден", ИдентификаторПровайдера);
+ Если Не ИспользуетсяКонструкторПараметров Тогда
Возврат;
КонецЕсли;
- ТаблицаПровайдеровПараметров.Удалить(СтрокаПровайдера);
+ КлассПараметров = КлассОбъект;
+
+ ИнтерфейсРеализован(ИнтерфейсПриемника, КлассОбъект, Истина);
+
+ ВнутреннийКонструкторПараметров.ИзКласса(КлассОбъект);
КонецПроцедуры
-// Добавляет встроенный провайдер по идентификаторы и приоритету
+// Создает, определяет и возвращает новый внутренний конструктор параметров
//
// Параметры:
-// ИмяПровайдера - строка - короткий идентификатор встроенных провайдеров (например, json)
-// Приоритет - число - Числовой приоритет выполнения провайдеры
+// КлассОбъект - Объект - Класс объект реализующий интерфейс конструктора параметров
//
-Процедура ДобавитьВстроенныйПровайдер(Знач ИмяПровайдера, Знач Приоритет) Экспорт
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на новый элемент класса <КонструкторПараметров>
+//
+Функция КонструкторПараметров(КлассОбъект = Неопределено) Экспорт
- КлассПровайдера = ВстроенныеПровайдеры[ИмяПровайдера];
+ Если ВнутреннийКонструкторПараметров = Неопределено Тогда
- ДобавитьПровайдерПараметров(ИмяПровайдера, КлассПровайдера, Новый Структура, Приоритет);
+ ВнутреннийКонструкторПараметров = ПолучитьКонструкторПараметров();
+
+ КонецЕсли;
+
+ ИспользуетсяКонструкторПараметров = Истина;
-КонецПроцедуры
+ Если ЗначениеЗаполнено(КлассОбъект)
+ И ИнтерфейсРеализован(ИнтерфейсПриемника, КлассОбъект, Истина) Тогда
+
+ УстановитьКлассПараметров(КлассОбъект);
+
+ КонецЕсли;
+
+ Возврат ВнутреннийКонструкторПараметров;
+
+КонецФункции
-// Устанавливает класс приемник для выгрузки результата чтения параметров
+// Создает и возвращает новый конструктор параметров
//
// Параметры:
-// КлассПараметров - Класс - произвольный класс, реализующий ряд экспортных процедур
+// ИмяКонструктора - Строка - наименование конструктора параметров
+// КлассОбъект - Объект - Класс объект реализующий интерфейс конструктора параметров
//
-Процедура УстановитьКлассПриемник(КлассПараметров) Экспорт
+// Возвращаемое значение:
+// Объект.КонструкторПараметров - ссылка на новый элемент класса <КонструкторПараметров>
+//
+Функция НовыйКонструкторПараметров(ИмяКонструктора, КлассОбъект = Неопределено) Экспорт
- КлассПриемникПараметров = КлассПараметров;
+ ВнутреннийКонструкторПараметров = КонструкторПараметров();
+ КонструкторПараметров = ВнутреннийКонструкторПараметров.НовыеПараметры(ИмяКонструктора);
-КонецПроцедуры
-
-#КонецОбласти
+ Если ЗначениеЗаполнено(КлассОбъект) Тогда
-#Область Вспомогательные процедуры и функции
+ КонструкторПараметров.ИзКласса(КлассОбъект);
+ КонецЕсли;
-Процедура ВыполнитьЧтениеПоТаблицеПровайдеров()
-
- ТаблицаПровайдеровПараметров.Сортировать("Приоритет ВОЗР");
- Лог.Отладка("Общее количество провайдеров <%1>", ТаблицаПровайдеровПараметров.Количество());
- Для каждого ПровайдерЧтения Из ТаблицаПровайдеровПараметров Цикл
+ Возврат КонструкторПараметров;
- Если ТипЗнч(ПровайдерЧтения.Класс) = Тип("Строка") Тогда
+КонецФункции
- Попытка
- КлассПровайдера = Новый(ПровайдерЧтения.Класс);
- Исключение
- Лог.КритичнаяОшибка("Не удалось прочитать параметры используя провайдер <%1>. По причине: %2", ПровайдерЧтения.Идентификатор, ОписаниеОшибки());
- Продолжить;
- КонецПопытки;
+#КонецОбласти
- Иначе
- КлассПровайдера = ПровайдерЧтения.Класс;
- КонецЕсли;
+#Область Вспомогательные_процедуры_и_функции
- Лог.Отладка("Класс провайдера <%1>", КлассПровайдера);
- Если Не ПроверитьКлассПровайдера(КлассПровайдера) Тогда
- Продолжить;
- КонецЕсли;
+Функция ПолучитьКонструкторПараметров()
- ВыполнитьЧтениеДляПровайдера(ПровайдерЧтения.Идентификатор, КлассПровайдера, ПровайдерЧтения.Настройки);
+ ИндексПараметровКонструктора = Новый Соответствие;
- КонецЦикла;
+ Конструктор = Новый КонструкторПараметров(ИндексПараметровКонструктора, "ОсновнаяНастройка");
-КонецПроцедуры
+ Возврат Конструктор;
-Функция НайтиПровайдераПоИдентификатору(Знач ИдентификаторПровайдера)
+КонецФункции
- Отбор = Новый Структура("Идентификатор", ИдентификаторПровайдера);
+Процедура ВыполнитьЧтениеПровайдеров()
- СтрокаПровайдера = ТаблицаПровайдеровПараметров.НайтиСтроки(Отбор);
+ КоллекцияПровайдеров = Новый ПроцессорКоллекций;
+ КоллекцияПровайдеров.УстановитьКоллекцию(ПровайдерыПараметров);
- Возврат СтрокаПровайдера;
+ КоличествоПровайдеров = КоллекцияПровайдеров
+ .Сортировать("Результат = Элемент1.Значение.Приоритет > Элемент2.Значение.Приоритет")
+ .Фильтровать("Результат = Элемент.Значение.Включен")
+ .Количество();
-КонецФункции
+ Если КоличествоПровайдеров = 0 Тогда
+ Возврат;
+ Иначе
-Функция ПроверитьКлассПровайдера(КлассЧтенияПараметров)
- НеобходимыйИнтерфейсЕсть = ПроверитьМетодКласса(КлассЧтенияПараметров, "ПрочитатьПараметры", 1, Истина);
+ ПроцедураЧтенияПровайдера = Новый ОписаниеОповещения("ОбработчикВыполненияЧтениеПровайдера", ЭтотОбъект);
+ КоллекцияПровайдеров.ДляКаждого(ПроцедураЧтенияПровайдера);
- Если НЕ НеобходимыйИнтерфейсЕсть Тогда
- Лог.КритичнаяОшибка("Класс <%1> не реализует необходимой функции <%2>", КлассЧтенияПараметров , "ПрочитатьПараметры(ПараметрыПровайдеры)" );
КонецЕсли;
- Возврат НеобходимыйИнтерфейсЕсть;
-КонецФункции
+КонецПроцедуры
-Процедура ВыполнитьЧтениеДляПровайдера(ИдентификаторПровайдера, КлассПровайдера, ПараметрыПровайдера)
+// Обработчик выполнения чтения провайдера
+//
+// Параметры:
+// Результат - КлючЗначение - Элемент индекса провайдеров
+// ДополнительныеПараметры - Структура - дополнительная структура
+//
+Процедура ОбработчикВыполненияЧтениеПровайдера(Результат, ДополнительныеПараметры) Экспорт
- Попытка
- ДополнитьПараметрыПровайдера(ПараметрыПровайдера, ОбщаяНастройка);
- ПрочитанныеПараметрыПровайдера = КлассПровайдера.ПрочитатьПараметры(ПараметрыПровайдера);
- Исключение
- Лог.КритичнаяОшибка("Не удалось прочитать параметры используя провайдер <%1>. По причине: %2", ИдентификаторПровайдера, ОписаниеОшибки());
- Возврат;
- КонецПопытки;
+ Провайдер = ДополнительныеПараметры.Элемент.Значение;
- Лог.Отладка("Провайдер <%1> вернул <%2> параметров",ИдентификаторПровайдера, ПрочитанныеПараметрыПровайдера.Количество());
- ОбъединитьПрочитанныеПараметры(ПрочитанныеПараметрыПровайдера, ПрочитанныеПараметры);
+ ВыполнитьЧтениеДляПровайдера(Провайдер);
КонецПроцедуры
-Процедура ДополнитьПараметрыПровайдера(ПараметрыПровайдера, ДополнительныеПараметры)
+Процедура ВыполнитьЧтениеДляПровайдера(КлассПровайдера)
- Лог.Отладка("Дополняю параметры провайдера общими параметрами");
- Для каждого КлючЗначение Из ДополнительныеПараметры Цикл
+ ИдентификаторПровайдера = КлассПровайдера.Идентификатор;
- КлючИсточника = КлючЗначение.Ключ;
- ЗначениеИсточника = КлючЗначение.Значение;
+ ПараметрыПровайдера = Новый Структура;
+ Если КлассПровайдера.ЭтоФайловыйПровайдер() Тогда
+ ПараметрыПровайдера = ПолучитьНастройкуФайловогоПровайдера().ПолучитьНастройки();
+ КонецЕсли;
- // Если НЕ ПараметрыПровайдера.Свойство(КлючИсточника) Тогда
- ПараметрыПровайдера.Вставить(КлючИсточника, ЗначениеИсточника);
- // КонецЕсли;
+ Попытка
+ ПрочитанныеПараметрыПровайдера = КлассПровайдера.ПрочитатьПараметры(ПараметрыПровайдера);
+ Исключение
+ Лог.КритичнаяОшибка("Не удалось прочитать параметры используя провайдер <%1>. По причине: %2",
+ ИдентификаторПровайдера,
+ ОписаниеОшибки());
+ Возврат;
+ КонецПопытки;
- КонецЦикла;
+ Лог.Отладка("Провайдер <%1> вернул количество параметров <%2>",
+ ИдентификаторПровайдера,
+ ПрочитанныеПараметрыПровайдера.Количество());
- Лог.Отладка("Всего параметров провайдера <%1>", ПараметрыПровайдера.Количество());
+ ОбъединитьПрочитанныеПараметры(ПрочитанныеПараметрыПровайдера, ПрочитанныеПараметры);
КонецПроцедуры
@@ -313,7 +354,7 @@
ЗначениеИсточника = КлючЗначение.Значение;
ЗначениеПриемника = Приемник[КлючИсточника];
- //Лог.Отладка("Ключ источника <%1>?<%2> значение приемника <%3>", КлючИсточника, ЗначениеИсточника, ЗначениеПриемника);
+
Если ЗначениеПриемника = Неопределено Тогда
Приемник.Вставить(КлючИсточника, ЗначениеИсточника);
Продолжить;
@@ -323,11 +364,11 @@
Продолжить;
КонецЕсли;
- Если ТипЗнч(ЗначениеИсточника) = Тип("Соответствие") тогда
+ Если ТипЗнч(ЗначениеИсточника) = Тип("Соответствие") Тогда
ОбъединитьПрочитанныеПараметры(ЗначениеИсточника, ЗначениеПриемника);
- ИначеЕсли ТипЗнч(ЗначениеИсточника) = Тип("Массив") тогда
+ ИначеЕсли ТипЗнч(ЗначениеИсточника) = Тип("Массив") Тогда
Для каждого ЭлементМассива Из ЗначениеИсточника Цикл
@@ -344,7 +385,6 @@
ЗначениеПриемника.Добавить(ЭлементМассива);
-
КонецЦикла;
КонецЕсли;
@@ -353,377 +393,11 @@
КонецПроцедуры
-Процедура Записать() Экспорт
-
- // ЗаписатьВФайл(ПутьКФайлуПараметров, РасширениеФайлаПараметров)
-
-КонецПроцедуры
-
-Процедура ЗаписатьВФайл(Знач ПутьКФайлуПараметров, Знач ФорматЗаписи = "json") Экспорт
- // Запись параметров
-КонецПроцедуры
-
-Процедура ОбновитьИндексПараметров()
-
- // Рекурсивный вызов для входящих параметров
- ДобавитьЗначениеПараметра("", ПрочитанныеПараметры);
-
-КонецПроцедуры
-
-Функция ЭтоМассив(Знач Значение)
- Возврат ТипЗнч(Значение) = Тип("Массив");
-КонецФункции
-
-Функция ЭтоСоответствие(Знач Значение)
- Возврат ТипЗнч(Значение) = Тип("Соответствие");
-КонецФункции
-
-Функция ЭтоСтруктура(Знач Значение)
- Возврат ТипЗнч(Значение) = Тип("Структура");
-КонецФункции
-
-Процедура ДобавитьПараметрВИндекс(Знач ИмяПараметра, Знач ЗначениеПараметра)
-
- // Вставляем все значение целиком
- // Для массивов и соответствий сразу
- Если Не ПустаяСтрока(ИмяПараметра) Тогда
- Лог.Отладка("Добавляю параметр <%1> со значением <%2> в индекс", ИмяПараметра, ЗначениеПараметра);
- ИндексПараметров.Вставить(ИмяПараметра, ЗначениеПараметра);
- КонецЕсли;
-
- // Рекурсивное заполнение значения параметра
- ДобавитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра);
-
-КонецПроцедуры
-
-Процедура ДобавитьЗначениеПараметра(Знач ИмяПараметра, Знач ЗначениеПараметра)
-
- Если ЭтоМассив(ЗначениеПараметра) Тогда
- ДобавитьПараметрМассивВИндекс(ЗначениеПараметра, ИмяПараметра);
- ИначеЕсли ЭтоСоответствие(ЗначениеПараметра) Тогда
- ДобавитьСоответствиеВИндекс(ЗначениеПараметра, ИмяПараметра);
- ИначеЕсли ЭтоСтруктура(ЗначениеПараметра) Тогда
- ДобавитьСоответствиеВИндекс(ЗначениеПараметра, ИмяПараметра);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ДобавитьПараметрМассивВИндекс(Знач МассивЗначений, Знач ИмяРодителя = "")
-
- Лог.Отладка("Обрабатываю массив значений <%1> ", ИмяРодителя);
-
- ШаблонИмениПараметра = "%1";
-
- Если Не ПустаяСтрока(ИмяРодителя) Тогда
- ШаблонИмениПараметра = ИмяРодителя + ".%1";
- КонецЕсли;
-
- Для ИндексЗначения = 0 По МассивЗначений.ВГраница() Цикл
-
- ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, ИндексЗначения);
- ДобавитьПараметрВИндекс(ИмяПараметра, МассивЗначений[ИндексЗначения]);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ДобавитьСоответствиеВИндекс(Знач ВходящиеПараметры, Знач ИмяРодителя = "")
-
- Лог.Отладка("Обрабатываю соответствие значений <%1> ", ИмяРодителя);
-
- ШаблонИмениПараметра = "%1";
-
- Если Не ПустаяСтрока(ИмяРодителя) Тогда
- ШаблонИмениПараметра = ИмяРодителя + ".%1";
- КонецЕсли;
-
- Для каждого КлючЗначение Из ВходящиеПараметры Цикл
-
- Лог.Отладка("Обрабатываю соответствие ключ <%1> ", КлючЗначение.Ключ);
-
- ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, КлючЗначение.Ключ);
- ЗначениеПараметра = КлючЗначение.Значение;
-
- ДобавитьПараметрВИндекс(ИмяПараметра, ЗначениеПараметра);
-
- КонецЦикла;
-
-КонецПроцедуры
-
Процедура ВыгрузитьПараметрыВКлассПриемник()
- СтруктураПараметров = КлассПриемникПараметров.ПолучитьПараметры();
-
- ЗаполнитьСтруктуруПараметров(СтруктураПараметров);
-
- КлассПриемникПараметров.УстановитьПараметры(СтруктураПараметров);
-
-КонецПроцедуры
-
-Процедура ДобавитьСоответствиеВСтруктуру(Знач ВходящиеПараметры, Знач ИмяРодителя = "")
-
- ШаблонИмениПараметра = "%1";
-
- Если Не ПустаяСтрока(ИмяРодителя) Тогда
- ШаблонИмениПараметра = ИмяРодителя + ".%1";
- КонецЕсли;
-
- Для каждого КлючЗначение Из ВходящиеПараметры Цикл
-
- ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, КлючЗначение.Ключ);
- ЗначениеПараметра = КлючЗначение.Значение;
-
- ДобавитьПараметрВИндекс(ИмяПараметра, ЗначениеПараметра);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ЗаполнитьСтруктуруПараметров(СтруктураПараметров)
-
- ЕстьОбработчикЗначения = Ложь; // Проверить на доступный метод ПриПолученииЗначения(ИмяСвойства, ЗначениеСвойства, СтандартнаяОбработка)
-
- Для каждого КлючЗначение Из СтруктураПараметров Цикл
-
- ИмяКлюча = КлючЗначение.Ключ;
- ТекущееЗначение = КлючЗначение.Значение;
-
- ИмяПараметра = ИмяКлюча;
-
- НовоеЗначение = Параметр(ИмяПараметра);
-
- Если НовоеЗначение = Неопределено Тогда
- Продолжить;
- КонецЕсли;
-
- СтандартнаяОбработка = Истина;
-
- ПриУстановкиЗначенияПараметра(ИмяПараметра, ИмяКлюча, НовоеЗначение, СтандартнаяОбработка);
-
- Если СтандартнаяОбработка Тогда
-
- СтруктураПараметров[ИмяКлюча] = ОбработатьЗначениеРекурсивно(ТекущееЗначение, НовоеЗначение, ИмяКлюча);
-
- КонецЕсли;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ПриУстановкиЗначенияПараметра(Знач ПолныйПутьКлюча, Знач ИмяКлюча, Значение, СтандартнаяОбработка)
-
- ЕстьНужныйМетод = Истина; // Добавить поверку 1 раз в кеш
- Если ЕстьНужныйМетод Тогда
- КлассПриемникПараметров.ПриУстановкиЗначенияПараметра(ПолныйПутьКлюча, ИмяКлюча, Значение, СтандартнаяОбработка);
- КонецЕсли;
-
-КонецПроцедуры
-
-Функция ОбработатьЗначениеРекурсивно(Знач ЗначениеСтруктуры, Знач ЗначениеПараметра, Знач ИмяПараметра = "")
-
- Если ЗначениеПараметра = Неопределено Тогда
- Возврат ЗначениеСтруктуры;
- КонецЕсли;
-
- Если ЭтоМассив(ЗначениеСтруктуры) Тогда
- Возврат ОбработатьЗначениеМассив(ЗначениеСтруктуры, ЗначениеПараметра, ИмяПараметра);
- ИначеЕсли ЭтоСоответствие(ЗначениеСтруктуры) Тогда
- Возврат ОбработатьЗначениеСоответствие(ЗначениеСтруктуры, ЗначениеПараметра, ИмяПараметра);
- ИначеЕсли ЭтоСтруктура(ЗначениеСтруктуры) Тогда
- Возврат ОбработатьЗначениеСтруктуру(ЗначениеСтруктуры, ЗначениеПараметра, ИмяПараметра);
- Иначе
- Возврат ЗначениеПараметра;
- КонецЕсли;
-
-КонецФункции
-
-Функция ОбработатьЗначениеМассив(Знач МассивСтруктуры, Знач МассивЗначений, Знач ИмяРодителя = "")
-
- Лог.Отладка("Обработка массива");
- Лог.Отладка("Структура приемник: ");
- Лог.Отладка("-- Имя родителя <%1>", ИмяРодителя);
- Лог.Отладка("-- Количество элементов <%1>", МассивЗначений.Количество());
-
- ШаблонИмениПараметра = "%1";
-
- Если Не ПустаяСтрока(ИмяРодителя) Тогда
- ШаблонИмениПараметра = ИмяРодителя + ".%1";
- КонецЕсли;
-
- Если МассивЗначений.Количество() = 0 Тогда
- Возврат МассивСтруктуры;
- КонецЕсли;
-
- Если МассивСтруктуры.Количество() > 0 Тогда
- ЗначениеСтруктуры = МассивЗначений[0];
- КонецЕсли;
-
- МассивСтруктуры.Очистить();
-
- Для ИндексЗначения = 0 По МассивЗначений.ВГраница() Цикл
-
- ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, ИндексЗначения);
-
- СтандартнаяОбработка = Истина;
-
- ЗначениеПараметра = Параметр(ИмяПараметра);
-
- НовоеЗначение = ОбработатьЗначениеРекурсивно(ЗначениеСтруктуры, ЗначениеПараметра, ИмяПараметра);
-
- Лог.Отладка("Параметр <%1> значение <%2>", ИмяПараметра, НовоеЗначение);
- ПриУстановкиЗначенияПараметра(ИмяПараметра, ИндексЗначения, НовоеЗначение, СтандартнаяОбработка);
-
- Если СтандартнаяОбработка Тогда
-
- МассивСтруктуры.Добавить(НовоеЗначение);
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат МассивСтруктуры;
-
-КонецФункции
-
-Функция ОбработатьЗначениеСоответствие(Знач СтруктураПриемник, Знач ВходящееСоответсвие, Знач ИмяРодителя = "")
-
- Лог.Отладка("Обработка соответствие ");
- Лог.Отладка("Структура приемник: ");
- Лог.Отладка("-- Имя родителя <%1>", ИмяРодителя);
- ПоказатьПараметрыВРежимеОтладки(СтруктураПриемник, ИмяРодителя);
-
- ШаблонИмениПараметра = "%1";
-
- Если Не ПустаяСтрока(ИмяРодителя) Тогда
- ШаблонИмениПараметра = ИмяРодителя + ".%1";
- КонецЕсли;
-
- НоваяКоллекция = Новый Соответствие;
-
- Для каждого КлючЗначение Из СтруктураПриемник Цикл
-
- ИмяКлюча = КлючЗначение.Ключ;
- ТекущееЗначение = КлючЗначение.Значение;
-
- ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, ИмяКлюча);
-
- НовоеЗначение = Параметр(ИмяПараметра);
-
- Если НовоеЗначение = Неопределено Тогда
- Продолжить;
- КонецЕсли;
-
- СтандартнаяОбработка = Истина;
-
- ПриУстановкиЗначенияПараметра(ИмяПараметра, ИмяКлюча, НовоеЗначение, СтандартнаяОбработка);
-
- Если СтандартнаяОбработка Тогда
-
- НоваяКоллекция[ИмяКлюча] = ОбработатьЗначениеРекурсивно(ТекущееЗначение, НовоеЗначение, ИмяПараметра);
-
- КонецЕсли;
-
- КонецЦикла;
-
- Для каждого КлючЗначение Из НоваяКоллекция Цикл
-
- ИмяКлюча = КлючЗначение.Ключ;
- ТекущееЗначение = КлючЗначение.Значение;
-
- СтруктураПриемник.Вставить(ИмяКлюча, ТекущееЗначение);
-
- КонецЦикла;
-
- Возврат СтруктураПриемник;
-
-КонецФункции
-
-Функция ОбработатьЗначениеСтруктуру(Знач СтруктураПриемник, Знач ВходящаяСтруктура, Знач ИмяРодителя = "")
-
- Лог.Отладка("Обработка структуры ");
- Лог.Отладка("Структура приемник: ");
- Лог.Отладка("-- Имя родителя <%1>", ИмяРодителя);
- ПоказатьПараметрыВРежимеОтладки(СтруктураПриемник, ИмяРодителя);
-
- ШаблонИмениПараметра = "%1";
-
- Если Не ПустаяСтрока(ИмяРодителя) Тогда
- ШаблонИмениПараметра = ИмяРодителя + ".%1";
- КонецЕсли;
-
- Для каждого КлючЗначение Из СтруктураПриемник Цикл
-
- ИмяКлюча = КлючЗначение.Ключ;
- ТекущееЗначение = КлючЗначение.Значение;
-
- ИмяПараметра = СтрШаблон(ШаблонИмениПараметра, ИмяКлюча);
-
- НовоеЗначение = Параметр(ИмяПараметра);
-
- Если НовоеЗначение = Неопределено Тогда
- Продолжить;
- КонецЕсли;
-
- СтандартнаяОбработка = Истина;
-
- ПриУстановкиЗначенияПараметра(ИмяПараметра, ИмяКлюча, НовоеЗначение, СтандартнаяОбработка);
-
- Если СтандартнаяОбработка Тогда
-
- СтруктураПриемник[ИмяКлюча] = ОбработатьЗначениеРекурсивно(ТекущееЗначение, НовоеЗначение, ИмяПараметра);
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат СтруктураПриемник;
-
-КонецФункции
-
-Функция ПроверитьМетодКласса(Знач ПроверяемыйКласс,
- Знач ИмяМетода,
- Знач ТребуемоеКоличествоПараметров = 0,
- Знач ЭтоФункция = Ложь)
-
- РефлекторПроверкиКоманд = Новый Рефлектор;
-
- ЕстьМетод = РефлекторПроверкиКоманд.МетодСуществует(ПроверяемыйКласс, ИмяМетода);
- Лог.Отладка("Проверяемый метод <%1> найден: %2", ИмяМетода, ЕстьМетод);
- Если Не ЕстьМетод Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ТаблицаМетодов = РефлекторПроверкиКоманд.ПолучитьТаблицуМетодов(ПроверяемыйКласс);
-
- СтрокаМетода = ТаблицаМетодов.Найти(ИмяМетода, "Имя");
- Лог.Отладка("Поиск строки в таблице методов класса <%1> найдена: %2, общее количество методов класса: %3", ПроверяемыйКласс, НЕ СтрокаМетода = Неопределено, ТаблицаМетодов.Количество());
- Если СтрокаМетода = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ПроверкаНаФункцию = ЭтоФункция = СтрокаМетода.ЭтоФункция;
- ПроверкаНаКоличествоПараметров = ТребуемоеКоличествоПараметров = СтрокаМетода.КоличествоПараметров;
-
- Лог.Отладка("Проверяемый метод <%1> корректен: %2", ИмяМетода, ПроверкаНаФункцию И ПроверкаНаКоличествоПараметров);
- Возврат ПроверкаНаФункцию
- И ПроверкаНаКоличествоПараметров;
-
-КонецФункции // ПроверитьМетодУКласса()
-
-Процедура ДобавитьСтандартныеПутиПоиска()
-
- СистемнаяИнформация = Новый СистемнаяИнформация;
-
- ДобавитьКаталогПоиска(ТекущийКаталог());
- ДобавитьКаталогПоиска(СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ЛокальныйКаталогДанныхПриложений));
- ДобавитьКаталогПоиска(СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ПрофильПользователя));
-
-КонецПроцедуры
-
-Процедура ОчиститьСтандартныеПутиПоиска()
-
- ОбщаяНастройка.КаталогиПоиска.Очистить();
+ СтруктураПараметров = ВнутреннийКонструкторПараметров.ВСтруктуру();
+ КлассПараметров.УстановитьПараметры(СтруктураПараметров);
КонецПроцедуры
@@ -734,7 +408,7 @@
Если ЗначенияПараметров.Количество() = 0 Тогда
Лог.Отладка(" Коллекция параметров пуста!");
КонецЕсли;
- Для каждого Элемент из ЗначенияПараметров Цикл
+ Для каждого Элемент Из ЗначенияПараметров Цикл
ПредставлениеКлюча = Элемент.Ключ;
Если Не ПустаяСтрока(Родитель) Тогда
ПредставлениеКлюча = СтрШаблон("%1.%2", Родитель, ПредставлениеКлюча);
@@ -747,62 +421,44 @@
КонецЦикла;
КонецПроцедуры
-#КонецОбласти
-
-#Область Инициализация
-
-Процедура ПриСозданииОбъекта(Знач Провайдеры = "json")
+Функция ПолучитьНастройкуФайловогоПровайдера()
- ИндексПараметров = Новый Соответствие;
- ПрочитанныеПараметры = Новый Соответствие;
-
-
- ТаблицаПровайдеровПараметров = Новый ТаблицаЗначений;
- ТаблицаПровайдеровПараметров.Колонки.Добавить("Идентификатор"); // Представление
- ТаблицаПровайдеровПараметров.Колонки.Добавить("Класс"); // ИмяКласса или Инстанс Класс
- ТаблицаПровайдеровПараметров.Колонки.Добавить("Приоритет"); // Число от 0 до 10
- ТаблицаПровайдеровПараметров.Колонки.Добавить("Настройки"); // Структура
-
- ПорядокПровайдеров = новый Массив;
-
- Лог.Отладка("Провайдеры при создании менеджера <%1>", Провайдеры);
-
- Если НЕ ЗначениеЗаполнено(Провайдеры) Тогда
- Провайдеры = "json";
+ Если НастройкаФайловогоПровайдера = Неопределено Тогда
+ НастройкаФайловогоПровайдера = Новый НастройкиФайловогоПровайдера;
КонецЕсли;
- МассивПровайдеров = СтрРазделить(Провайдеры, ";", Ложь);
-
- ДоступныеПровайдеры = ВстроенныеПровайдеры.ДоступныеПровайдеры;
-
- ИндексПриоритета = 0;
+ Возврат НастройкаФайловогоПровайдера;
- Для каждого ИмяПровайдера Из МассивПровайдеров Цикл
+КонецФункции
- Лог.Отладка("Добавляю встроенный провайдер <%1>", ИмяПровайдера);
+#КонецОбласти
- Если ДоступныеПровайдеры.Свойство(ИмяПровайдера) Тогда
+#Область Инициализация
- ДобавитьВстроенныйПровайдер(ИмяПровайдера, ИндексПриоритета);
+Процедура ПриСозданииОбъекта()
- КонецЕсли;
+ ИндексПараметров = Новый ИндексЗначений;
+ ИндексПараметров.Коллекция(Новый Соответствие);
+
+ ПрочитанныеПараметры = Новый Соответствие;
+ ПровайдерыПараметров = Новый Соответствие;
+ ЧтениеПараметровВыполнено = Ложь;
- ИндексПриоритета = ИндексПриоритета + 1;
+ ИнтерфейсПриемника = Новый ИнтерфейсОбъекта;
+ ИнтерфейсПриемника.П("УстановитьПараметры", 1);
+ ИнтерфейсПриемника.Ф("ОписаниеПараметров", 1);
- КонецЦикла;
+ ВнутреннийКонструкторПараметров = Неопределено;
+ ИспользуетсяКонструкторПараметров = Ложь;
- ОбщаяНастройка = Новый Структура();
- ОбщаяНастройка.Вставить("ФайлПараметров", Неопределено);
- ОбщаяНастройка.Вставить("КаталогиПоиска", Новый Массив);
- ОбщаяНастройка.Вставить("ИмяФайлаПараметров", "config");
- ОбщаяНастройка.Вставить("РасширениеФайла", ""); // Дополнительные ограничение для провайдеров
- ОбщаяНастройка.Вставить("КлючЗначениеПараметров", Новый Массив); // Пути к файлам параметров или другая информация от провайдеров
+КонецПроцедуры
- ДобавитьСтандартныеПутиПоиска();
+Функция ИнтерфейсРеализован(Интерфейс, КлассОбъект, ВыдатьОшибку = Ложь)
- ЧтениеПараметровВыполнено = Ложь;
+ РефлекторОбъекта = Новый РефлекторОбъекта(КлассОбъект);
+ Возврат РефлекторОбъекта.РеализуетИнтерфейс(Интерфейс, ВыдатьОшибку);
-КонецПроцедуры
+КонецФункции
#КонецОбласти
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
deleted file mode 100644
index 4bf0865..0000000
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262JSON.os"
+++ /dev/null
@@ -1,370 +0,0 @@
-#Использовать json
-#Использовать asserts
-#Использовать logos
-
-Перем Лог;
-
-#Область ПрограммныйИнтерфейс
-
-// Выполняет чтение параметров
-//
-// Параметры:
-// ПараметрыПровайдера - <Структура> - структура настроек провайдера
-// Возвращаемое значение:
-// <Соответствие> - итоговые параметры
-//
-Функция ПрочитатьПараметры(ПараметрыПровайдера) Экспорт
-
- ПрочитанныеПараметры = Новый Соответствие;
-
- Если ЗначениеЗаполнено(ПараметрыПровайдера.ФайлПараметров) Тогда
-
- ФайлПараметров = Новый Файл(ПараметрыПровайдера.ФайлПараметров);
-
- Если Не ФайлПараметров.Существует() Тогда
- Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя);
- Возврат ПрочитанныеПараметры;
- КонецЕсли;
-
- Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя);
- ПрочитанныеПараметры = Прочитать(ФайлПараметров.ПолноеИмя);
-
- Иначе
-
- Если НЕ ЗначениеЗаполнено(ПараметрыПровайдера.ИмяФайлаПараметров) Тогда
- ВызватьИсключение СтрШаблон("Не задано имя файла параметров");
- КонецЕсли;
-
- Если ПараметрыПровайдера.КаталогиПоиска.Количество() = 0 Тогда
- ВызватьИсключение СтрШаблон("Не заданы пути поиска файла параметров");
- КонецЕсли;
-
- ПутьКФайлуПараметров = НайтиФайлПараметров(ПараметрыПровайдера.КаталогиПоиска, ПараметрыПровайдера.ИмяФайлаПараметров, ПараметрыПровайдера.РасширениеФайла);
-
- Если НЕ ЗначениеЗаполнено(ПутьКФайлуПараметров) Тогда
- Лог.Отладка("Не найден файл параметров <%1>", ПутьКФайлуПараметров);
- Возврат ПрочитанныеПараметры;
- КонецЕсли;
-
- ПрочитанныеПараметры = Прочитать(ПутьКФайлуПараметров);
-
- КонецЕсли;
-
- Возврат ПрочитанныеПараметры;
-
-КонецФункции
-
-Функция НайтиФайлПараметров(КаталогиПоиска, ИмяФайлаПараметров, РасширениеФайлаПараметров)
-
- РасширениеФайлов = ".json";
-
- Если ЗначениеЗаполнено(РасширениеФайлаПараметров) Тогда
-
- РасширениеФайлов = РасширениеФайлаПараметров;
-
- КонецЕсли;
-
- МассивИменФайлов = Новый Массив;
- МассивРасширений = СтрРазделить(РасширениеФайлов, ";", Ложь);
-
- Для каждого РасширениеФайла Из МассивРасширений Цикл
-
- Если Не СтрНачинаетсяС(РасширениеФайла, ".") Тогда
- РасширениеФайла = "."+РасширениеФайла;
- КонецЕсли;
-
- МассивИменФайлов.Добавить(ИмяФайлаПараметров+РасширениеФайла);
-
- КонецЦикла;
-
- НайденныйФайл = Неопределено;
-
- Для каждого ПутьПоиска Из КаталогиПоиска Цикл
-
- Лог.Отладка(" поиск в каталоге <%1>", ПутьПоиска);
-
- Для каждого ФайлПоиска Из МассивИменФайлов Цикл
-
- ФайлПараметровПоиска = Новый Файл(ОбъединитьПути(ПутьПоиска, ФайлПоиска));
-
- Лог.Отладка(" ищю файл <%1>", ОбъединитьПути(ПутьПоиска, ФайлПоиска));
-
- Если Не ФайлПараметровПоиска.Существует() Тогда
- Продолжить;
- КонецЕсли;
-
- НайденныйФайл = ФайлПараметровПоиска.ПолноеИмя;
- Прервать;
-
- КонецЦикла;
-
- Если Не НайденныйФайл = Неопределено Тогда
-
- Лог.Отладка("Использую файл параметров <%1>", НайденныйФайл);
- Прервать;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат НайденныйФайл;
-
-КонецФункции
-
-// Выполнить чтение настроек из файла
-//
-// Параметры:
-// ПутьКФайлуНастройки - <строка> - путь к файлу настроек
-// Возвращаемое значение:
-// <Соответствие> - итоговые параметры
-//
-Функция Прочитать(Знач ПутьКФайлуНастройки)
-
- НастройкиИзФайла = Новый Соответствие;
-
- Попытка
-
- Лог.Отладка("ПутьКФайлуНастройки <%1>", ПутьКФайлуНастройки);
-
- НастройкиИзФайла = ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки);
-
- ОбработатьШаблонныеПодстановки(НастройкиИзФайла);
-
- Лог.Отладка("Итоговые параметры:");
- ПоказатьПараметрыВРежимеОтладки(НастройкиИзФайла);
- Исключение
- Лог.Ошибка("Ошибка чтения настроек
- |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
- // |%1", ОписаниеОшибки());
-
- ВызватьИсключение;
- КонецПопытки;
-
- Возврат НастройкиИзФайла;
-
-КонецФункции // Прочитать
-
-Функция ПрочитатьНастройкиИзПараметраФайл(ПутьКФайлуНастройки)
-
- ЧитаемОдинФайл = Истина;
- МассивИменФайлов = Неопределено;
-
- ФайлНастроек = Новый Файл(ПутьКФайлуНастройки);
-
- НастройкиИзФайла = ПрочитатьФайлJSON(ФайлНастроек.ПолноеИмя);
-
- ОбработатьПараметрыРекурсивно(НастройкиИзФайла, ФайлНастроек.Путь);
-
- Возврат НастройкиИзФайла;
-КонецФункции // ПрочитатьНастройкиИзПараметраФайл()
-
-Функция ПрочитатьФайлJSON(Знач ИмяФайла)
- Перем Параметры;
-
- Лог.Отладка("Путь файла настроек <%1>", ИмяФайла);
-
- СообщениеОшибки = СтрШаблон("Файл настроек не существует. Путь <%1>", ИмяФайла);
- JsonСтрока = ПрочитатьФайл(ИмяФайла, СообщениеОшибки);
-
- Лог.Отладка("Текст файла настроек:
- |%1", JsonСтрока);
-
- JsonСтрока = ВырезатьКомментарииИзТекстаJSON(JsonСтрока);
-
- ПарсерJSON = Новый ПарсерJSON();
- Параметры = ПарсерJSON.ПрочитатьJSON(JsonСтрока);
-
- Файл = Новый Файл(ИмяФайла);
- ПутьКаталогаФайла = Файл.Путь;
-
- ОбработатьПараметрыРекурсивно(Параметры, ПутьКаталогаФайла);
-
- Возврат Параметры;
-КонецФункции
-
-Функция ПрочитатьФайл(Знач ИмяФайла, Знач СообщениеОшибки)
- ФайлСуществующий = Новый Файл(ИмяФайла);
- Если Не ФайлСуществующий.Существует() Тогда
- ВызватьИсключение СообщениеОшибки;
- КонецЕсли;
-
- Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
- Рез = Чтение.Прочитать();
- Чтение.Закрыть();
- Возврат Рез;
-КонецФункции // ПрочитатьФайл()
-
-Функция ВырезатьКомментарииИзТекстаJSON(Знач JsonСтрока)
-
- // вырезаем обычные комменты типа "// комментарий"
- Регулярка = Новый РегулярноеВыражение("(^\/\/.*$)");
- Рез = Регулярка.Заменить(JsonСтрока, "$0" );
-
- // вырезаем комменты после строки, например, "строка //комментарий"
- Регулярка = Новый РегулярноеВыражение("(^.*)(\/\/.*$)");
- Рез = Регулярка.Заменить(Рез, "$1" );
-
- Возврат Рез;
-КонецФункции // ВырезатьКомментарииИзТекстаJSON()
-
-Процедура ОбработатьПараметрыРекурсивно(Источник, ПутьКаталогаФайла)
-
- ПрефиксПараметрФайл = "ReadFile";//ЧтениеПараметров.ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек();
-
- КлючиКДополнительномуЧтению = Новый Массив;
-
- Для каждого КлючЗначение Из Источник Цикл
-
- Ключ = КлючЗначение.Ключ;
- Значение = КлючЗначение.Значение;
-
- Если ТипЗнч(Значение) = Тип("Соответствие") Тогда
-
- ОбработатьПараметрыРекурсивно(Значение, ПутьКаталогаФайла);
-
- Иначе
-
- Если СтрНачинаетсяС( ВРег(Ключ), ВРег(ПрефиксПараметрФайл)) Тогда
- КлючиКДополнительномуЧтению.Добавить(Ключ);
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Для каждого Ключ Из КлючиКДополнительномуЧтению Цикл
-
- Значение = Источник[Ключ];
-
- ПрочитатьФайлИзЗначенияПараметра(Ключ, Значение, ПутьКаталогаФайла, Источник);
-
- Источник.Удалить(Ключ);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Функция ПрочитатьФайлИзЗначенияПараметра( Ключ, Значение, ПутьКаталогаФайла, Приемник)
- ПрефиксПараметрФайл = РаботаСПараметрами.ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек();
- ЕстьПараметрФайл = СтрНачинаетсяС( ВРег(Ключ), ВРег(ПрефиксПараметрФайл) );
-
- Если НЕ ЕстьПараметрФайл Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Лог.Отладка("Нашли ключ файла <%1>, значение <%2>, путь каталога-родителя <%3>", Ключ, Значение, ПутьКаталогаФайла);
-
- ПутьФайла = ОбъединитьПути(ПутьКаталогаФайла, Значение);
- Параметры = ПрочитатьФайлJSON(ПутьФайла);
-
- ОбработатьПараметрыРекурсивно(Параметры, ПутьКаталогаФайла);
-
- Для каждого КлючЗначение Из Параметры Цикл
-
- Ключ = КлючЗначение.Ключ;
- Значение = КлючЗначение.Значение;
-
- Приемник.Вставить(Ключ, Значение);
-
- КонецЦикла;
-
- Возврат Истина;
-КонецФункции // ПрочитатьФайлИзЗначенияПараметра( Ключ, Значение, ПутьКаталогаФайла, Приемник)
-
-Процедура ОбработатьШаблонныеПодстановки(Параметры)
-
- РегулярноеВыражение = Новый РегулярноеВыражение( "%([^%]*)%" );
-
- Для Счетчик = 1 По 5 Цикл
-
- МассивПодстановок = Новый Массив;
-
- НайтиШаблонныеПодстановки(Параметры, МассивПодстановок, РегулярноеВыражение);
-
- Если НЕ ЗначениеЗаполнено(МассивПодстановок) Тогда
- Прервать;
- КонецЕсли;
-
- ЗначенияКлючей = Новый Соответствие;
- НайтиВсеКлючи(Параметры, ЗначенияКлючей);
-
- ВыполнитьПодстановки(МассивПодстановок, ЗначенияКлючей);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура НайтиШаблонныеПодстановки(Параметры, Знач МассивПодстановок, Знач РегулярноеВыражение)
-
- Для каждого КлючЗначение Из Параметры Цикл
- Значение = КлючЗначение.Значение;
- Тип = ТипЗнч(Значение);
- Если Тип = Тип("Строка") Тогда
- КоллекцияСовпадений = РегулярноеВыражение.НайтиСовпадения( Значение );
- Если КоллекцияСовпадений.Количество() > 0 Тогда
- Описание = Новый Структура("Ключ, Параметры", КлючЗначение.Ключ, Параметры);
- Описание.Вставить("КоллекцияСовпадений", КоллекцияСовпадений);
- МассивПодстановок.Добавить(Описание);
-
- Лог.Отладка("Нашли значение для подстановки <%1>", Значение);
- КонецЕсли;
-
- ИначеЕсли Тип = Тип("Соответствие") Тогда
- НайтиШаблонныеПодстановки(Значение, МассивПодстановок, РегулярноеВыражение);
- КонецЕсли;
-
- КонецЦикла;
-КонецПроцедуры
-
-Процедура ВыполнитьПодстановки(МассивПодстановок, ЗначенияКлючей)
- Для каждого ОписаниеПодстановки Из МассивПодстановок Цикл
- КлючПодстановки = ОписаниеПодстановки.Ключ;
-
- КоллекцияСовпадений = ОписаниеПодстановки.КоллекцияСовпадений;
- Для каждого Совпадение Из КоллекцияСовпадений Цикл
- Значение = Совпадение.Значение;
- ИмяКлюча = Совпадение.Группы[1].Значение;
- Лог.Отладка("Нашли имя ключа <%1> для возможной подстановки в <%2>", ИмяКлюча, Значение);
-
- ЗначениеПоКлючу = ЗначенияКлючей[ИмяКлюча];
- Если ЗначениеПоКлючу <> Неопределено Тогда
- ОписаниеПодстановки.Параметры.Вставить(КлючПодстановки, ЗначениеПоКлючу);
- КонецЕсли;
- КонецЦикла;
- КонецЦикла;
-КонецПроцедуры
-
-Процедура НайтиВсеКлючи(Параметры, ЗначенияКлючей)
- Для каждого КлючЗначение Из Параметры Цикл
- Ключ = КлючЗначение.Ключ;
- Значение = КлючЗначение.Значение;
-
- Если ТипЗнч(Значение) = Тип("Соответствие") Тогда
- НайтиВсеКлючи(Значение, ЗначенияКлючей);
- Иначе
- ЗначенияКлючей.Вставить(Ключ, Значение);
- КонецЕсли;
-
- КонецЦикла;
-КонецПроцедуры
-
-Процедура ПоказатьПараметрыВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "")
- Если Родитель = "" Тогда
- Лог.Отладка(" Тип параметров %1", ТипЗнч(ЗначенияПараметров));
- КонецЕсли;
- Если ЗначенияПараметров.Количество() = 0 Тогда
- Лог.Отладка(" Коллекция параметров пуста!");
- КонецЕсли;
- Для каждого Элемент из ЗначенияПараметров Цикл
- ПредставлениеКлюча = Элемент.Ключ;
- Если Не ПустаяСтрока(Родитель) Тогда
- ПредставлениеКлюча = СтрШаблон("%1.%2", Родитель, ПредставлениеКлюча);
- КонецЕсли;
- Лог.Отладка(" Получен параметр <%1> = <%2>", ПредставлениеКлюча, Элемент.Значение);
- Если ТипЗнч(Элемент.Значение) = Тип("Соответствие") Тогда
- ПоказатьПараметрыВРежимеОтладки(Элемент.Значение, ПредставлениеКлюча);
- КонецЕсли;
- КонецЦикла;
-КонецПроцедуры
-
-Лог = Логирование.ПолучитьЛог("oscript.lib.configor.provider-json");
diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
deleted file mode 100644
index ad74353..0000000
--- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262YAML.os"
+++ /dev/null
@@ -1,26 +0,0 @@
-#Использовать logos
-
-Перем Лог;
-
-#Область ПрограммныйИнтерфейс
-
-// Выполняет чтение параметров
-//
-// Параметры:
-// ПараметрыПровайдера - <Структура> - структура настроек провайдера
-// Возвращаемое значение:
-// <Соответствие> - итоговые параметры
-//
-Функция ПрочитатьПараметры(ПараметрыПровайдера) Экспорт
-
- ПрочитанныеПараметры = Новый Соответствие;
-
- Лог.Отладка("Чтение параметров из файлов не реализовано");
-
- Возврат ПрочитанныеПараметры;
-
-КонецФункции
-
-#КонецОбласти
-
-Лог = Логирование.ПолучитьЛог("oscript.lib.configor.yaml");
\ No newline at end of file
diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\321\201\321\202\321\200\320\276\320\265\320\275\320\275\321\213\320\265\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\321\213.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\321\201\321\202\321\200\320\276\320\265\320\275\320\275\321\213\320\265\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\321\213.os"
deleted file mode 100644
index 0426429..0000000
--- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\222\321\201\321\202\321\200\320\276\320\265\320\275\320\275\321\213\320\265\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\321\213.os"
+++ /dev/null
@@ -1,9 +0,0 @@
-Перем json Экспорт;
-Перем yaml Экспорт;
-Перем ДоступныеПровайдеры Экспорт;
-
-json = "ПровайдерПараметровJSON";
-yaml = "ПровайдерПараметровYAML";
-
-ДоступныеПровайдеры = Новый Структура("json, yaml", json, yaml);
-
diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os"
deleted file mode 100644
index 27fa0db..0000000
--- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os"
+++ /dev/null
@@ -1,45 +0,0 @@
-Перем ТекущийПрефиксКлючаДляЧтенияВложенногоФайлаНастроек;
-
-// Создает нового менеджера параметров
-//
-// Параметры:
-// ИмяФайлаПараметров - Строка - имя файла параметров
-// КаталогПоиск - Строка - дополнительный каталог поиска параметров
-// Провайдер - Строка - перечень провайдеров (по умолчанию "json;yaml")
-// КлассПараметров - Класс - класс приемник результат чтения параметров
-// Возвращаемое значение
-// Класс МенеджерПараметров
-//
-Функция НовыйМенеджерПараметров(ИмяФайлаПараметров, КаталогПоиска = "", Провайдер = "json;yaml", КлассПараметров = Неопределено) Экспорт
-
- МенеджерПараметров = Новый МенеджерПараметров(Провайдер);
-
- МенеджерПараметров.УстановитьИмяФайла(ИмяФайлаПараметров);
-
- Если ЗначениеЗаполнено(КаталогПоиска) Тогда
- МенеджерПараметров.ДобавитьКаталогПоиска(КаталогПоиска);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(КлассПараметров) Тогда
- МенеджерПараметров.УстановитьКлассПриемник(КлассПараметров);
- КонецЕсли;
-
- Возврат МенеджерПараметров;
-
-КонецФункции
-
-// Устанавливаетпрефикс ключа для чтения вложенных файлов
-// (по умолчанию )
-//
-// Параметры:
-// НовыйПрефикс - Строка - префикс ключа для чтения вложенных файлов
-//
-Процедура УстановитьПрефиксКлючаДляЧтенияВложенногоФайлаНастроек(Знач НовыйПрефикс) Экспорт
- ТекущийПрефиксКлючаДляЧтенияВложенногоФайлаНастроек = НовыйПрефикс;
-КонецПроцедуры
-
-Функция ПрефиксКлючаДляЧтенияВложенногоФайлаНастроек() Экспорт
- Возврат ТекущийПрефиксКлючаДляЧтенияВложенногоФайлаНастроек;
-КонецФункции
-
-ТекущийПрефиксКлючаДляЧтенияВложенногоФайлаНастроек = "ReadFile";
\ No newline at end of file
diff --git a/tasks/coverage.os b/tasks/coverage.os
new file mode 100644
index 0000000..a136c94
--- /dev/null
+++ b/tasks/coverage.os
@@ -0,0 +1,29 @@
+#Использовать coverage
+#Использовать 1commands
+
+ФС.ОбеспечитьПустойКаталог("coverage");
+ПутьКСтат = "coverage/stat.json";
+
+Команда = Новый Команда;
+Команда.УстановитьКоманду("oscript");
+Команда.ДобавитьПараметр("-encoding=utf-8");
+Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат));
+Команда.ДобавитьПараметр("tasks/test.os");
+Команда.ПоказыватьВыводНемедленно(Истина);
+
+КодВозврата = Команда.Исполнить();
+
+Файл_Стат = Новый Файл(ПутьКСтат);
+
+ИмяПакета = "configor";
+
+ПроцессорГенерации = Новый ГенераторОтчетаПокрытия();
+
+ПроцессорГенерации.ОтносительныеПути()
+ .ФайлСтатистики(Файл_Стат.ПолноеИмя)
+ .GenericCoverage()
+ .Cobertura()
+ .Clover(ИмяПакета)
+ .Сформировать();
+
+ЗавершитьРаботу(КодВозврата);
\ No newline at end of file
diff --git a/tasks/test.os b/tasks/test.os
index cf5d8e4..c2c954d 100644
--- a/tasks/test.os
+++ b/tasks/test.os
@@ -57,6 +57,8 @@
Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался;
КонецФункции // ПрогнатьФичи()
+ТестыПрошли = Истина;
+
Попытка
ТестыПрошли = ПрогнатьТесты();
@@ -68,13 +70,13 @@
ФичиПрошли = Истина;
-// Попытка
-// ФичиПрошли = ПрогнатьФичи();
-// Исключение
-// ФичиПрошли = Ложь;
-// Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно
-// |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
-// КонецПопытки;
+Попытка
+ ФичиПрошли = ПрогнатьФичи();
+Исключение
+ ФичиПрошли = Ложь;
+ Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно
+ |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
+КонецПопытки;
Если Не ТестыПрошли Или Не ФичиПрошли Тогда
ВызватьИсключение "Тестирование завершилось неудачно!";
diff --git "a/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os" "b/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os"
new file mode 100644
index 0000000..f37c5d5
--- /dev/null
+++ "b/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os"
@@ -0,0 +1,45 @@
+Перем мПараметры;
+
+Функция Параметры() Экспорт
+ Возврат мПараметры;
+КонецФункции
+
+Процедура УстановитьПараметры(Знач ВходящиеПараметры) Экспорт
+ мПараметры = ВходящиеПараметры;
+КонецПроцедуры
+
+Процедура ОписаниеПараметров(Знач Конструктор) Экспорт
+
+ ПараметрСоответствиеСтруктуры = Конструктор.НовыеПараметры("ПараметрСоответствиеСтруктуры")
+ .ПолеСтрока("КлючВнутри1")
+ .ПолеСтрока("КлючВнутри2")
+ ;
+
+ ПараметрСтруктураВнутри = Конструктор.НовыеПараметры("ПараметрСоответствиеСтруктуры")
+ .ПолеСтрока("Ключ1")
+ .ПолеСтрока("Ключ2")
+ ;
+ ПараметрСоответствие = Конструктор.НовыеПараметры("ПараметрСоответствие")
+ .ПолеСтрока("Ключ1")
+ .ПолеСтрока("Ключ2")
+ ;
+
+ ПараметрСтруктура = Конструктор.НовыеПараметры("ВложеннаяСтруктура")
+ .ПолеСтрока("Строка")
+ .ПолеДата("Дата")
+ .ПолеЧисло("Число")
+ .ПолеМассив("Массив", Тип("Строка"))
+ .ПолеОбъект("Структура", ПараметрСтруктураВнутри)
+ .ПолеОбъект("Соответствие", ПараметрСоответствиеСтруктуры)
+ ;
+
+ Конструктор.ПолеСтрока("version")
+ .ПолеСтрока("ПараметрСтрока")
+ .ПолеДата("ПараметрДата")
+ .ПолеЧисло("ПараметрЧисло")
+ .ПолеМассив("ПараметрМассив", Тип("Строка"))
+ .ПолеОбъект("ПараметрСтруктура struct", ПараметрСтруктура)
+ .ПолеОбъект("ПараметрСоответствие", ПараметрСоответствие)
+ ;
+
+КонецПроцедуры
diff --git "a/tests/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270_test.os" "b/tests/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270_test.os"
new file mode 100644
index 0000000..687d291
--- /dev/null
+++ "b/tests/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270_test.os"
@@ -0,0 +1,217 @@
+#использовать "../"
+#Использовать asserts
+#Использовать logos
+#Использовать tempfiles
+#Использовать json
+
+Перем юТест;
+Перем Лог;
+
+Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ ИменаТестов = Новый Массив;
+
+ ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеПараметровИзКонструктора");
+ ИменаТестов.Добавить("ТестДолжен_ПроверитьУдалениеПоляИзКонструктора");
+ ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеПроизвольныхПолейКонструтора");
+ // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
+ // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");
+
+ Возврат ИменаТестов;
+
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьЧтениеПараметровИзКонструктора() Экспорт
+
+ МенеджерПараметров = Новый МенеджерПараметров();
+ Конструктор = МенеджерПараметров.КонструкторПараметров();
+
+ ПараметрОбъект = Конструктор.НовыеПараметры("ПростойОбъект")
+ .ПолеСтрока("Поле1")
+ .ПолеСтрока("Поле2")
+ ;
+
+ ДатаПроверки = ТекущаяДата();
+ ПараметрСтруктура = Конструктор.НовыеПараметры("ВложеннаяСтруктура")
+ .ПолеСтрока("СтрокаСтруктуры")
+ .ПолеДата("ДатаСтруктуры", ТекущаяДата())
+ .ПолеДата("ТекущаяДата")
+ .ПолеЧисло("ЧислоСтруктуры")
+ .ПолеОбъект("Объект object", ПараметрОбъект)
+ .ПолеМассив("МассивСтрок", Тип("Строка"))
+ .ПолеМассив("МассивЧисел", Тип("Число"))
+ .ПолеМассив("МассивДат", Тип("Дата"))
+ .ПолеМассив("МассивОбъектов", ПараметрОбъект)
+ ;
+
+ Конструктор.ПолеСтрока("Версия version")
+ .ПолеСтрока("СтрокаНастройки")
+ .ПолеДата("ДатаНастройки")
+ .ПолеДата("ТекущаяДата", ДатаПроверки)
+ .ПолеЧисло("ЧислоНастройки")
+ .ПолеОбъект("ПараметрСтруктура struct", ПараметрСтруктура)
+ .ПолеМассив("МассивОбъектов array-struct", ПараметрОбъект)
+ .ПолеМассив("МассивСтрок", Тип("Строка"))
+ .ПолеМассив("МассивЧисел", Тип("Число"))
+ .ПолеМассив("МассивДат", Тип("Дата"))
+ ;
+
+ СтруктураПараметров = Новый Структура("version, СтрокаНастройки, ДатаНастройки,
+ | ЧислоНастройки, МассивСтрок, МассивЧисел, ПараметрСтруктура, ПараметрСоответствие",
+ "1.0",
+ "ПростоСтрока",
+ Дата(2017, 1, 1),
+ 10,
+ ПолучитьНовыйМассив("Элемент1, Элемент2, Элемент3"),
+ ПолучитьНовыйМассив("1, 2, 3"),
+ Новый Структура("СтрокаСтруктуры, ЧислоСтруктуры, МассивСтрок, Объект, Соответствие",
+ "ПростоСтрока",
+ 10,
+ ПолучитьНовыйМассив("Элемент1, Элемент2, Элемент3"),
+ Новый Структура("Поле1, Поле2", "ЗначениеСтруктуры", "ЗначениеСтруктуры2"),
+ ПолучитьСоответствие("КлючВнутри1, КлючВнутри2", "Значение1, Значение2")
+ ),
+ ПолучитьСоответствие("Ключ1, Ключ2", "Значение1, Значение2")
+ );
+
+ ПарсерJSON = Новый ПарсерJSON;
+ ТекстФайлаПроверки = ПарсерJSON.ЗаписатьJSON(СтруктураПараметров);
+
+ ТестовыйФайл = ПодготовитьТестовыйФайл(ТекстФайлаПроверки);
+
+ ТестовоеИмя = "config";
+ ТестовоеРасширение = ".json";
+
+ ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
+ КопироватьФайл(ТестовыйФайл, ОбъединитьПути(ВременныйКаталог, ТестовоеИмя + ТестовоеРасширение));
+
+ МенеджерПараметров.АвтоНастройка(ТестовоеИмя);
+ НастройкаПоискаФайла = МенеджерПараметров.НастройкаПоискаФайла();
+ НастройкаПоискаФайла.ДобавитьКаталогПоиска(ВременныйКаталог);
+ МенеджерПараметров.Прочитать();
+
+ ПроверитьРезультат(СтруктураПараметров.version, МенеджерПараметров.Параметр("Версия"));
+ ПроверитьРезультат(СтруктураПараметров.СтрокаНастройки, МенеджерПараметров.Параметр("СтрокаНастройки"));
+ ПроверитьРезультат(СтруктураПараметров.ДатаНастройки, МенеджерПараметров.Параметр("ДатаНастройки"));
+ ПроверитьРезультат(ДатаПроверки, МенеджерПараметров.Параметр("ТекущаяДата"));
+ ПроверитьРезультат(СтруктураПараметров.ЧислоНастройки, МенеджерПараметров.Параметр("ЧислоНастройки"));
+ ПроверитьРезультат(СтруктураПараметров.ПараметрСтруктура.СтрокаСтруктуры, МенеджерПараметров.Параметр("ПараметрСтруктура.СтрокаСтруктуры"));
+ ПроверитьРезультат(СтруктураПараметров.ПараметрСтруктура.ЧислоСтруктуры, МенеджерПараметров.Параметр("ПараметрСтруктура.ЧислоСтруктуры"));
+ ПроверитьРезультат(СтруктураПараметров.ДатаНастройки, МенеджерПараметров.Параметр("ДатаНастройки"));
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьУдалениеПоляИзКонструктора() Экспорт
+
+ ИндексПараметров = Новый Соответствие;
+
+ КонструкторПараметров = Новый КонструкторПараметров(ИндексПараметров, "ТестовыйКонструктор");
+ КонструкторПараметров.ПолеСтрока("Поле1 fiels-1")
+ .ПолеСтрока("Поле2 fiels-2")
+ ;
+ КонструкторПараметров.УдалитьПоле("Поле1")
+ .УдалитьПоле("fiels-2")
+ ;
+
+ ИндексПолей = КонструкторПараметров.ПолучитьИндексПолей();
+
+ Ожидаем.Что(ИндексПолей.Количество(), "Индекс полей должен быть пустым").Равно(0);
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьЧтениеПроизвольныхПолейКонструтора() Экспорт
+
+ СтруктураПараметров = Новый Соответствие();
+ СтруктураПараметров.Вставить("--custom-feild", "ПроизвольноеПоле");
+ СтруктураПараметров.Вставить("Поле", "ЗаданноеПоле");
+
+ ПарсерJSON = Новый ПарсерJSON;
+ ТекстФайлаПроверки = ПарсерJSON.ЗаписатьJSON(СтруктураПараметров);
+
+ ТестовыйФайл = ПодготовитьТестовыйФайл(ТекстФайлаПроверки);
+
+ ТестовоеИмя = "config";
+ ТестовоеРасширение = ".json";
+
+ ПарсерJSON = Новый ПарсерJSON;
+ ТекстФайлаПроверки = ПарсерJSON.ЗаписатьJSON(СтруктураПараметров);
+
+ ТестовыйФайл = ПодготовитьТестовыйФайл(ТекстФайлаПроверки);
+
+ ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
+ КопироватьФайл(ТестовыйФайл, ОбъединитьПути(ВременныйКаталог, ТестовоеИмя + ТестовоеРасширение));
+
+ МенеджерПараметров = Новый МенеджерПараметров();
+ Конструктор = МенеджерПараметров.КонструкторПараметров();
+ Конструктор.ПолеСтрока("Поле")
+ .ПроизвольныеПоля();
+
+ МенеджерПараметров.АвтоНастройка(ТестовоеИмя);
+ НастройкаПоискаФайла = МенеджерПараметров.НастройкаПоискаФайла();
+ НастройкаПоискаФайла.ДобавитьКаталогПоиска(ВременныйКаталог);
+ МенеджерПараметров.Прочитать();
+
+ ПроверитьРезультат(СтруктураПараметров["--custom-feild"], МенеджерПараметров.Параметр("--custom-feild"));
+ ПроверитьРезультат(СтруктураПараметров["Поле"], МенеджерПараметров.Параметр("Поле"));
+
+ ВременныеФайлы.УдалитьФайл(ВременныйКаталог);
+
+КонецПроцедуры
+
+Процедура ПроверитьРезультат(Значение1, Значение2)
+ Утверждения.ПроверитьРавенство(Значение1, Значение2, "Результат должен совпадать с ожиданиями.");
+КонецПроцедуры
+
+Функция ПодготовитьТестовыйФайл(Знач ТестФайла)
+
+ ТестовыйФайл = ВременныеФайлы.НовоеИмяФайла("json");
+
+ ЗаписьТекста = Новый ЗаписьТекста;
+ ЗаписьТекста.Открыть(ТестовыйФайл);
+ ЗаписьТекста.ЗаписатьСтроку(ТестФайла);
+ ЗаписьТекста.Закрыть();
+
+ Возврат ТестовыйФайл;
+
+КонецФункции
+
+Функция ПолучитьНовыйМассив(ЗначенияМассив)
+
+ Массив = Новый Массив();
+
+ МассивЗначений = СтрРазделить(ЗначенияМассив, ", ");
+
+ Для ИндексКлюча = 0 По МассивЗначений.ВГраница() Цикл
+
+ Массив.Добавить(МассивЗначений[ИндексКлюча]);
+
+ КонецЦикла;
+
+ Возврат Массив;
+
+КонецФункции
+
+Функция ПолучитьСоответствие(Ключи, Значения)
+
+ Соответствие = Новый Соответствие();
+
+ МассивКлючей = СтрРазделить(Ключи, ", ");
+ МассивЗначений = СтрРазделить(Значения, ", ");
+
+ Для ИндексКлюча = 0 По МассивКлючей.ВГраница() Цикл
+
+ Соответствие.Вставить(МассивКлючей[ИндексКлюча], МассивЗначений[ИндексКлюча]);
+
+ КонецЦикла;
+
+ Возврат Соответствие;
+
+КонецФункции
+
+Лог = Логирование.ПолучитьЛог("oscript.lib.configor.constructor");
+// Лог.УстановитьУровень(УровниЛога.Отладка);
+
+ЛогПровайдера = Логирование.ПолучитьЛог("oscript.lib.configor.provider-json");
+// ЛогПровайдера.УстановитьУровень(УровниЛога.Отладка);
\ No newline at end of file
diff --git "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\247\321\202\320\265\320\275\320\270\321\217\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262_test.os" "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\247\321\202\320\265\320\275\320\270\321\217\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262_test.os"
index 7884bc5..eb6b5be 100644
--- "a/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\247\321\202\320\265\320\275\320\270\321\217\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262_test.os"
+++ "b/tests/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\247\321\202\320\265\320\275\320\270\321\217\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262_test.os"
@@ -1,4 +1,4 @@
-#использовать "../"
+#использовать "../src/"
#Использовать asserts
#Использовать logos
#Использовать tempfiles
@@ -16,9 +16,7 @@
ИменаТестов.Добавить("ТестДолжен_ПроверитьПолучениеПараметровИзИндекса");
ИменаТестов.Добавить("ТестДолжен_ПроверитьВыгрузкуПараметровВКласс");
ИменаТестов.Добавить("ТестДолжен_ПроверитьПоискИЧтениеФайлаПараметров");
- // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
- // ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");
-
+
Возврат ИменаТестов;
КонецФункции
@@ -47,13 +45,13 @@
| { ""test"": ""тестмассива1"" }
| ]
|}", "values.0.import values.1.test", "тестмассива0 тестмассива1"));
-
МенеджерПараметров = Новый МенеджерПараметров;
Для каждого Тест Из ТестовыеСлучаи Цикл
ТестовыйФайл = ПодготовитьТестовыйФайл(Тест.ТекстФайлаПроверки);
+ МенеджерПараметров.АвтоНастройка("config");
МенеджерПараметров.УстановитьФайлПараметров(ТестовыйФайл);
МенеджерПараметров.Прочитать();
@@ -66,23 +64,25 @@
УдалитьФайлы(ТестовыйФайл);
- КонецЦикла
+ КонецЦикла;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьВыгрузкуПараметровВКласс() Экспорт
МенеджерПараметров = Новый МенеджерПараметров();
- СтруктураПараметров = Новый Структура("version, ПараметрСтрока, ПараметрЧисло, ПараметрМассив, ПараметрСтруктура, ПараметрСоответствие",
+ СтруктураПараметров = Новый Структура("version, ПараметрСтрока, ПараметрДата, ПараметрЧисло, ПараметрМассив, ПараметрСтруктура, ПараметрСоответствие",
"1.0",
"ПростоСтрока",
+ ТекущаяДата(),
10,
ПолучитьНовыйМассив("Элемент1, Элемент2, Элемент3"),
- Новый Структура("Строка, Число, Массив, Структура, Соответствие",
+ Новый Структура("Строка, Дата, Число, Массив, Структура, Соответствие",
"ПростоСтрока",
+ ТекущаяДата(),
10,
ПолучитьНовыйМассив("Элемент1, Элемент2, Элемент3"),
- Новый Структура("Строка, Строка2", "ЗначениеСтруктуры", "ЗначениеСтруктуры2"),
+ Новый Структура("Ключ1, Ключ2", "ЗначениеСтруктуры", "ЗначениеСтруктуры2"),
ПолучитьСоответствие("КлючВнутри1, КлючВнутри2", "Значение1, Значение2")
),
ПолучитьСоответствие("Ключ1, Ключ2", "Значение1, Значение2")
@@ -91,15 +91,15 @@
ПарсерJSON = Новый ПарсерJSON;
ТекстФайлаПроверки = ПарсерJSON.ЗаписатьJSON(СтруктураПараметров);
-
- КлассПараметров = ПодготовитьТестовыйКласс(СтруктураПараметров);
+ КлассПараметров = ПодготовитьТестовыйКласс();
ТестовыйФайл = ПодготовитьТестовыйФайл(ТекстФайлаПроверки);
+ МенеджерПараметров.АвтоНастройка("config");
МенеджерПараметров.УстановитьФайлПараметров(ТестовыйФайл);
- МенеджерПараметров.УстановитьКлассПриемник(КлассПараметров);
+ МенеджерПараметров.КонструкторПараметров(КлассПараметров);
МенеджерПараметров.Прочитать();
- ПроверочнаяСтруктура = КлассПараметров.ПолучитьВнутренниеПараметры();
+ ПроверочнаяСтруктура = КлассПараметров.Параметры();
ТекстПроверки = ПарсерJSON.ЗаписатьJSON(ПроверочнаяСтруктура);
Утверждения.ПроверитьРавенство(ТекстФайлаПроверки, ТекстПроверки, "Результат должен совпадать с ожиданиями.");
@@ -135,9 +135,9 @@
ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
КопироватьФайл(ТестовыйФайл, ОбъединитьПути(ВременныйКаталог, ТестовоеИмя + ТестовоеРасширение));
- МенеджерПараметров.УстановитьИмяФайла(ТестовоеИмя);
- МенеджерПараметров.ДобавитьКаталогПоиска(ВременныйКаталог);
-
+ МенеджерПараметров.АвтоНастройка(ТестовоеИмя);
+ НастройкаПоискаФайла = МенеджерПараметров.НастройкаПоискаФайла();
+ НастройкаПоискаФайла.ДобавитьКаталогПоиска(ВременныйКаталог);
МенеджерПараметров.Прочитать();
Утверждения.ПроверитьРавенство(СтруктураПараметров.ПараметрМассив[0], МенеджерПараметров.Параметр("ПараметрМассив.0"), "Результат должен совпадать с ожиданиями.");
@@ -181,31 +181,9 @@
КонецФункции
-Функция ПодготовитьТестовыйКласс(ОбщиеПараметры)
-
- ТекстМодуляКласса = "
- |
- |//Перем ОбщиеПараметры; // Передается контекстом при создании класса
- |Перем ВнутренниеПараметры;
- |
- |Функция ПолучитьПараметры() Экспорт
- | Возврат ОбщиеПараметры;
- |КонецФункции
- |
- |Функция ПолучитьВнутренниеПараметры() Экспорт
- | Возврат ВнутренниеПараметры;
- |КонецФункции
- |
- |Процедура УстановитьПараметры(НовыеПараметры)Экспорт
- | ВнутренниеПараметры = НовыеПараметры;
- |КонецПроцедуры
- |
- |Процедура ПриУстановкиЗначенияПараметра(Знач ПолныйПутьКлюча, Знач ИмяКлюча, Значение, СтандартнаяОбработка) Экспорт
- | //Сообщить(""Попал >> ПриУстановкиЗначенияПараметра для параметра: "" + ПолныйПутьКлюча);
- |КонецПроцедуры
- |";
+Функция ПодготовитьТестовыйКласс()
- Возврат ЗагрузитьСценарийИзСтроки(ТекстМодуляКласса, Новый Структура("ОбщиеПараметры", ОбщиеПараметры));
+ Возврат ЗагрузитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "ТестовыйКласс.os"));
КонецФункции
@@ -248,4 +226,4 @@
Лог.УстановитьУровень(УровниЛога.Отладка);
ЛогПровайдера = Логирование.ПолучитьЛог("oscript.lib.configor.provider-json");
-ЛогПровайдера.УстановитьУровень(УровниЛога.Отладка);
\ No newline at end of file
+// ЛогПровайдера.УстановитьУровень(УровниЛога.Отладка);
\ No newline at end of file
diff --git a/travis-ci.sh b/travis-ci.sh
index ff38ba2..4d5204c 100644
--- a/travis-ci.sh
+++ b/travis-ci.sh
@@ -1,9 +1,18 @@
+
+set -e
+echo "Устанавливаю версию OScript <$OSCRIPT_VERSION>"
+curl http://oscript.io/downloads/$OSCRIPT_VERSION/deb > oscript.deb
+dpkg -i oscript.deb
+rm -f oscript.deb
+
opm install 1testrunner;
opm install 1bdd;
-
+opm install notify;
+opm install coverage;
opm install;
-opm test;
+
+opm run coverage;