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;