diff --git a/.travis.yml b/.travis.yml index 5c709e6..9864bef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,24 @@ +language: none + sudo: required dist: trusty +git: + depth: false + addons: sonarqube: true jdk: - - oraclejdk8 + - openjdk11 before_install: - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF - echo "deb http://download.mono-project.com/repo/ubuntu trusty main" | sudo tee /etc/apt/sources.list.d/mono-official.list - sudo apt-get update - sudo apt-get install mono-complete mono-devel - - wget -O os.deb http://oscript.io/downloads/night-build/deb + - wget -O os.deb http://oscript.io/downloads/1_0_21/deb - sudo dpkg -i os.deb; sudo apt install -f - sudo opm install 1commands - sudo opm install 1testrunner diff --git a/CHANGELOG.md b/CHANGELOG.md index ecfd9cf..2c1c61e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## 0.4.0 + +* Добавлен конвейерный метод Развернуть/flatMap +* Добавлено создание процессора коллекций из набора параметров (varargs...) + +## 0.3.1 + +* Реальный переезд на использование API `Новый ОписаниеОповещения()` + +## 0.3.0 + +* Обновление `notify` до версии `0.2.0` +* Отказ от создания временных файлов в пользу создания описания оповещения через `ЗагрузитьСценарийИзСтроки` +* Переезд на движок версии `1.0.18` + ## 0.2.2 * Исправлена ошибка неудаления временных файлов при вызове некоторых терминальных методов diff --git a/README.md b/README.md index fb31034..699992d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # fluent + [![Build Status](https://travis-ci.org/nixel2007/oscript-fluent.svg?branch=develop)](https://travis-ci.org/nixel2007/oscript-fluent) -[![Quality Gate](https://sonar.silverbulleters.org/api/badges/gate?key=oscript-fluent)](https://sonar.silverbulleters.org/dashboard/index/oscript-fluent) -[![Coverage](https://sonar.silverbulleters.org/api/badges/measure?key=oscript-fluent&metric=coverage)](https://sonar.silverbulleters.org/dashboard/index/oscript-fluent) -[![Tech debt](https://sonar.silverbulleters.org/api/badges/measure?key=oscript-fluent&metric=sqale_debt_ratio)](https://sonar.silverbulleters.org/dashboard/index/oscript-fluent) +[![Quality Gate](https://sonar.oscript.ru/api/project_badges/measure?project=oscript-fluent&metric=alert_status)](https://sonar.oscript.ru/dashboard?id=oscript-fluent) +[![Maintainability](https://sonar.oscript.ru/api/project_badges/measure?project=oscript-fluent&metric=sqale_rating)](https://sonar.oscript.ru/dashboard?id=oscript-fluent) +[![Coverage](https://sonar.oscript.ru/api/project_badges/measure?project=oscript-fluent&metric=coverage)](https://sonar.oscript.ru/dashboard?id=oscript-fluent) Библиотека быстрой обработки коллекций. @@ -14,14 +15,18 @@ > Структуры и соответствия incoming Конвейерные методы: + * Первые * Пропустить * Различные * Обработать +* Развернуть * Фильтровать * Сортировать +* СортироватьПо Терминальные методы: + * ПолучитьПервый * ВМассив * ВСтроку @@ -36,12 +41,15 @@ * ВсеНеСоответствуют Функции сравнения, фильтрации, обработки могут задаваться с помощью: + * Строк * Описаний оповещения (библиотека [notify](https://github.com/oscript-library/notify)) Библиотека помимо конструктора класса `ПроцессорКоллекций` содержит вспомогательный модуль, включающий: + * построитель процессора коллекций `ИзКоллекции()` * построитель процессора коллекций `ИзСтроки()` +* построитель процессора коллекций `ИзНабора()` * `СтандартнаяФункцияСравнения()` - типовой `comparator`, возвращающий результат сравнения как `1`, `0`, `-1` * `СтандартнаяФункцияОбработки_Сообщить()` - функция сообщения каждого элемента в консоль @@ -253,6 +261,46 @@ Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт ``` +#### Развернуть + +```bsl +// Развернуть каждый элемент коллекции в процессор коллекций. +// Позволяет расширить имеющуюся коллекцию. +// Например, разворачивание массива массивов сделает новый массив, содерщщий все элементы всех массивов. +// Конвейерный метод. +// +// Параметры: +// ФункцияРазворачивания - Строка, ОписаниеОповещения - функция разворачивания. +// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные +// "Результат", "ДополнительныеПараметры", "Элемент". +// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра +// (имена произвольные): +// Результат - ПроцессорКоллекций - Переменная, в которую должен быть +// помещен результат работы функции в виде ПроцессораКоллекций. +// ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания. +// +// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания. +// Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания. +// По умолчанию содержит одно значение - Элемент. +// +// Возвращаемое значение: +// ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". +// +// Примеры: +// 1: +// ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);"); +// +// 2: +// Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт +// Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент); +// КонецПроцедуры +// +// ФункцияРазворачивания = Новый ОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект); +// ПроцессорКоллекций.Развернуть(ФункцияРазворачивания); +// +Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт +``` + #### Фильтровать ```bsl @@ -329,6 +377,47 @@ Функция Сортировать(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт ``` +#### СортироватьПо + +```bsl +// Сортировать элементы коллекции по выбранному полю. +// Конвейерный метод. +// +// Параметры: +// ИмяПоля - Строка - Имя поля элемента коллекции, по которому необходимо осуществлять сортировку. +// +// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. +// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные +// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". +// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра +// (имена произвольные): +// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. +// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. +// Если параметр не передан, выполняется стандартная функция сравнения: +// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() +// +// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. +// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. +// По умолчанию содержит два значения - Элемент1 и Элемент2. +// +// Возвращаемое значение: +// ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". +// +// Примеры: +// 1: +// ПроцессорКоллекций.СортироватьПо("НомерСтроки", "Результат = Элемент1 > Элемент2"); +// +// 2: +// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт +// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; +// КонецПроцедуры +// +// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ПроцессорКоллекций.СортироватьПо("НомерСтроки", ФункцияСравнения); +// +Функция СортироватьПо(Знач ИмяПоля, Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт +``` + > Терминальные методы #### ПолучитьПервый @@ -680,6 +769,24 @@ Функция ИзСтроки(Строка, РазделительСтрок = Неопределено, ВключатьПустые = Истина) Экспорт ``` +#### ИзНабора + +```bsl +// Создать ПроцессорКоллекций на основании переданного набора значений. +// Добавляет элемент в ПроцессорКоллекций, если он не равен NULL. +// +// Параметры: +// Элемент1 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент2 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент3 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// ... Всего 32 параметра ... +// +// Возвращаемое значение: +// ПроцессорКоллекций - Инстанс класса ПроцессорКоллекций, заполненный переданным набором. +// +Функция ИзНабора(Элемент1 = NULL, Элемент2 = NULL, Элемент3 = NULL, ...) Экспорт +``` + #### СтандартнаяФункцияСравнения ```bsl diff --git a/packagedef b/packagedef index a80a20a..444e1be 100644 --- a/packagedef +++ b/packagedef @@ -1,6 +1,6 @@ Описание.Имя("fluent") - .Версия("0.3.1") + .Версия("0.4.0") .Описание("Библиотека для работы с коллекциями в ""текучем"" стиле") .Автор("Nikita Gryzlov") .АдресАвтора("nixel2007@gmail.com") diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" index 5034828..b0d7df9 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" @@ -151,6 +151,36 @@ КонецПроцедуры +Процедура ВыполнитьРазвернуть(Результат, ДополнительныеПараметры) Экспорт + + Обработчик = ДополнительныеПараметры.Обработчик; + + Лог.Отладка("ВыполнитьРазвернуть %1", Обработчик.ИмяПроцедуры); + + Результат = Новый Массив; + + Если Обработчик.ДополнительныеПараметры = Неопределено Тогда + Обработчик.ДополнительныеПараметры = Новый Структура; + КонецЕсли; + Обработчик.ДополнительныеПараметры.Вставить("Элемент"); + + Для Каждого Элемент Из Коллекция Цикл + Обработчик.ДополнительныеПараметры.Элемент = Элемент; + РезультатРазворачивания = Элемент; + ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатРазворачивания); + + ДСО = СтрШаблон("Результат разворачивания для элемента %1 должен иметь тип ПроцессорКоллекций", Элемент); + Ожидаем.Что(РезультатРазворачивания, ДСО).ИмеетТип("ПроцессорКоллекций"); + + РезультатРазворачивания.ДляКаждого( + "ДополнительныеПараметры.Результат.Добавить(Элемент);", + Новый Структура("Результат", Результат) + ); + + КонецЦикла; + +КонецПроцедуры + Процедура ВыполнитьСортировать(Результат, ДополнительныеПараметры) Экспорт Обработчик = ДополнительныеПараметры.Обработчик; @@ -189,6 +219,45 @@ КонецПроцедуры +Процедура ВыполнитьСортироватьПо(Результат, ДополнительныеПараметры) Экспорт + + Обработчик = ДополнительныеПараметры.Обработчик; + ИмяПоля = Обработчик.ДополнительныеПараметры.ИмяПоля; + Лог.Отладка("ВыполнитьСортироватьПо %1", Обработчик.ИмяПроцедуры); + + Результат = Коллекция; + + Если Обработчик.ДополнительныеПараметры = Неопределено Тогда + Обработчик.ДополнительныеПараметры = Новый Структура; + КонецЕсли; + Обработчик.ДополнительныеПараметры.Вставить("Элемент1"); + Обработчик.ДополнительныеПараметры.Вставить("Элемент2"); + + Для й = 0 По Результат.Количество() - 1 Цикл + Флаг = Ложь; + к = Результат.Количество() - 1; + Пока к > й Цикл + Элемент = Результат[к - 1]; + СледующийЭлемент = Результат[к]; + + Обработчик.ДополнительныеПараметры.Элемент1 = Элемент[ИмяПоля]; + Обработчик.ДополнительныеПараметры.Элемент2 = СледующийЭлемент[ИмяПоля]; + РезультатСортировки = Неопределено; + ОписанияОповещений.ВыполнитьОбработкуОповещения(Обработчик, РезультатСортировки); + Если РезультатСортировки > 0 Тогда + Результат[к - 1] = СледующийЭлемент; + Результат[к] = Элемент; + Флаг = Истина; + КонецЕсли; + к = к - 1; + КонецЦикла; + Если НЕ Флаг Тогда + Прервать; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + Процедура Инициализация() Лог = Логирование.ПолучитьЛог("oscript.lib.stream"); КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" index 52d69aa..2090ef1 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" @@ -105,6 +105,7 @@ ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; КонецЕсли; + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); ПоложитьЯчейкуВКонвейер("Различные", ФункцияСравнения); Возврат ЭтотОбъект; @@ -147,12 +148,59 @@ Если ТипЗнч(ФункцияОбработки) = Тип("Строка") Тогда ФункцияОбработки = СформироватьВременноеОписаниеОповещения(ФункцияОбработки, ДополнительныеПараметры); КонецЕсли; + ДополнитьСтруктуру(ФункцияОбработки.ДополнительныеПараметры, ДополнительныеПараметры, Истина); ПоложитьЯчейкуВКонвейер("Обработать", ФункцияОбработки); Возврат ЭтотОбъект; КонецФункции +// Развернуть каждый элемент коллекции в процессор коллекций. +// Позволяет расширить имеющуюся коллекцию. +// Например, разворачивание массива массивов сделает новый массив, содерщщий все элементы всех массивов. +// Конвейерный метод. +// +// Параметры: +// ФункцияРазворачивания - Строка, ОписаниеОповещения - функция разворачивания. +// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные +// "Результат", "ДополнительныеПараметры", "Элемент". +// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра +// (имена произвольные): +// Результат - ПроцессорКоллекций - Переменная, в которую должен быть +// помещен результат работы функции в виде ПроцессораКоллекций. +// ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания. +// +// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания. +// Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания. +// По умолчанию содержит одно значение - Элемент. +// +// Возвращаемое значение: +// ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". +// +// Примеры: +// 1: +// ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);"); +// +// 2: +// Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт +// Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент); +// КонецПроцедуры +// +// ФункцияРазворачивания = Новый ОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект); +// ПроцессорКоллекций.Развернуть(ФункцияРазворачивания); +// +Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт + + Если ТипЗнч(ФункцияРазворачивания) = Тип("Строка") Тогда + ФункцияРазворачивания = СформироватьВременноеОписаниеОповещения(ФункцияРазворачивания, ДополнительныеПараметры); + КонецЕсли; + ДополнитьСтруктуру(ФункцияРазворачивания.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + + ПоложитьЯчейкуВКонвейер("Развернуть", ФункцияРазворачивания); + Возврат ЭтотОбъект; + +КонецФункции + // Фильтровать коллекцию по условию. // Конвейерный метод. // @@ -189,7 +237,8 @@ Если ТипЗнч(ФункцияФильтрации) = Тип("Строка") Тогда ФункцияФильтрации = СформироватьВременноеОписаниеОповещения(ФункцияФильтрации, ДополнительныеПараметры); КонецЕсли; - + ДополнитьСтруктуру(ФункцияФильтрации.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПоложитьЯчейкуВКонвейер("Фильтровать", ФункцияФильтрации); Возврат ЭтотОбъект; @@ -237,12 +286,66 @@ ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; КонецЕсли; - + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПоложитьЯчейкуВКонвейер("Сортировать", ФункцияСравнения); Возврат ЭтотОбъект; КонецФункции +// Сортировать элементы коллекции по выбранному полю. +// Конвейерный метод. +// +// Параметры: +// ИмяПоля - Строка - Имя поля элемента коллекции, по которому необходимо осуществлять сортировку. +// +// ФункцияСравнения - Строка, ОписаниеОповещения - Функция сравнения. +// В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные +// "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". +// В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра +// (имена произвольные): +// "Результат" - Булево - Переменная, в которой возвращается значение работы функции. +// "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. +// Если параметр не передан, выполняется стандартная функция сравнения: +// см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() +// +// ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. +// Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. +// По умолчанию содержит два значения - Элемент1 и Элемент2. +// +// Возвращаемое значение: +// ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". +// +// Примеры: +// 1: +// ПроцессорКоллекций.СортироватьПо("НомерСтроки", "Результат = Элемент1 > Элемент2"); +// +// 2: +// Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт +// Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; +// КонецПроцедуры +// +// ФункцияСравнения = Новый ОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); +// ПроцессорКоллекций.СортироватьПо("НомерСтроки", ФункцияСравнения); +// +Функция СортироватьПо(Знач ИмяПоля, Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт + + Если ФункцияСравнения = Неопределено Тогда + ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); + Иначе + Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда + ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); + КонецЕсли; + КонецЕсли; + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + + ФункцияСравнения.ДополнительныеПараметры.Вставить("ИмяПоля", ИмяПоля); + + ПоложитьЯчейкуВКонвейер("СортироватьПо", ФункцияСравнения); + Возврат ЭтотОбъект; + +КонецФункции + // Терминальные методы // Получить первый элемент. @@ -373,7 +476,8 @@ Если ТипЗнч(ФункцияОбработки) = Тип("Строка") Тогда ФункцияОбработки = СформироватьВременноеОписаниеОповещения(ФункцияОбработки, ДополнительныеПараметры); КонецЕсли; - + ДополнитьСтруктуру(ФункцияОбработки.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПройтиКонвейер(); ДополнительныеПараметры = Новый Структура; @@ -432,7 +536,8 @@ ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; КонецЕсли; - + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПройтиКонвейер(); Результат = Новый Массив; @@ -498,6 +603,7 @@ ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; КонецЕсли; + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); ПройтиКонвейер(); @@ -560,15 +666,13 @@ Если ТипЗнч(ФункцияСокращения) = Тип("Строка") Тогда ФункцияСокращения = СформироватьВременноеОписаниеОповещения(ФункцияСокращения, ДополнительныеПараметры); КонецЕсли; - + ДополнитьСтруктуру(ФункцияСокращения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПройтиКонвейер(); - + Результат = НачальноеЗначение; Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); Для Каждого Элемент Из Коллекция Цикл - Если ФункцияСокращения.ДополнительныеПараметры = Неопределено Тогда - ФункцияСокращения.ДополнительныеПараметры = Новый Структура; - КонецЕсли; ФункцияСокращения.ДополнительныеПараметры.Вставить("Элемент", Элемент); ОписанияОповещений.ВыполнитьОбработкуОповещения(ФункцияСокращения, Результат); КонецЦикла; @@ -604,8 +708,8 @@ Колонки = Результат.Колонки; Исключение РезультатСодержитКолонки = Ложь; - Конецпопытки; - + КонецПопытки; + Если РезультатСодержитКолонки Тогда Для Каждого Колонка Из КэшКолонок Цикл Результат.Колонки.Добавить( @@ -667,17 +771,15 @@ Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; - + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПройтиКонвейер(); Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); Результат = Ложь; - - Если ФункцияСравнения.ДополнительныеПараметры = Неопределено Тогда - ФункцияСравнения.ДополнительныеПараметры = Новый Структура; - КонецЕсли; + ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); - + Для Каждого Элемент Из Коллекция Цикл ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; РезультатФильтрации = Ложь; @@ -716,28 +818,26 @@ // В обратном случае возвращает Ложь. // Если коллекция пустая, возвращает Истина. // -Функция ВсеСоответствуют(Знач ОписаниеОповещения, Знач ДополнительныеПараметры = Неопределено) Экспорт +Функция ВсеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт Лог.Отладка("ВсеСоответствуют"); - Если ТипЗнч(ОписаниеОповещения) = Тип("Строка") Тогда - ОписаниеОповещения = СформироватьВременноеОписаниеОповещения(ОписаниеОповещения, ДополнительныеПараметры); + Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда + ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; - + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПройтиКонвейер(); Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); Результат = Истина; - Если ОписаниеОповещения.ДополнительныеПараметры = Неопределено Тогда - ОписаниеОповещения.ДополнительныеПараметры = Новый Структура; - КонецЕсли; - ОписаниеОповещения.ДополнительныеПараметры.Вставить("Элемент"); + ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); Для Каждого Элемент Из Коллекция Цикл - ОписаниеОповещения.ДополнительныеПараметры.Элемент = Элемент; + ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; РезультатФильтрации = Ложь; - ОписанияОповещений.ВыполнитьОбработкуОповещения(ОписаниеОповещения, РезультатФильтрации); + ОписанияОповещений.ВыполнитьОбработкуОповещения(ФункцияСравнения, РезультатФильтрации); Если НЕ РезультатФильтрации Тогда Результат = Ложь; @@ -779,15 +879,13 @@ Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); КонецЕсли; - + ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); + ПройтиКонвейер(); Коллекция = ПроцессорКоллекцийСлужебный.ПолучитьКоллекцию(); Результат = Истина; - Если ФункцияСравнения.ДополнительныеПараметры = Неопределено Тогда - ФункцияСравнения.ДополнительныеПараметры = Новый Структура; - КонецЕсли; ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); Для Каждого Элемент Из Коллекция Цикл @@ -908,7 +1006,52 @@ | А = 0; | |КонецПроцедуры"; + +КонецПроцедуры +// Дополняет структуру значениями из другой структуры. +// +// Параметры: +// Приемник - Структура - коллекция, в которую будут добавляться новые значения. +// Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. +// Заменять - Булево, Неопределено - что делать в местах пересечения ключей источника и приемника: +// Истина - заменять значения приемника (самый быстрый способ), +// Ложь - не заменять значения приемника (пропускать), +// Неопределено - значение по умолчанию. Бросать исключение. +// +// Функция скопирована из "Библиотеки Стандартных Подсистем" на следующих условиях: +// +// Copyright (c) 2018, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +// +// В функцию внесены следующие изменения: +// * использование СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку заменено на СтрШаблон; +// * добавлена инициализиация структур приемника и источника +// +Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт + + Если Приемник = Неопределено Тогда + Приемник = Новый Структура; + КонецЕсли; + + Если Источник = Неопределено Тогда + Источник = Новый Структура; + КонецЕсли; + + Для Каждого Элемент Из Источник Цикл + Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда + Если Заменять = Ложь Тогда + Продолжить; + Иначе + ВызватьИсключение СтрШаблон(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); + КонецЕсли + КонецЕсли; + Приемник.Вставить(Элемент.Ключ, Элемент.Значение); + КонецЦикла; + КонецПроцедуры Инициализация(); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" index 78367e7..3b05c23 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\321\200\320\276\321\206\320\265\321\201\321\201\320\276\321\200\321\213\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\271.os" @@ -50,6 +50,75 @@ КонецФункции +// Создать ПроцессорКоллекций на основании переданного набора значений. +// Добавляет элемент в ПроцессорКоллекций, если он не равен NULL. +// +// Параметры: +// Элемент1 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент2 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент3 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент4 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент5 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент6 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент7 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент8 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент8 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент9 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент10 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент11 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент12 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент13 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент14 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент15 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент16 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент17 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент18 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент18 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент19 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент20 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент21 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент22 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент23 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент24 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент25 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент26 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент27 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент28 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент28 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент29 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент30 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент31 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// Элемент32 - Произвольный - Элемент для добавления в ПроцессорКоллекций. +// +// Возвращаемое значение: +// ПроцессорКоллекций - Инстанс класса ПроцессорКоллекций, заполненный переданным набором. +// +Функция ИзНабора( + // BSLLS:NumberOfParams-off + // BSLLS:NumberOfOptionalParams-off + Элемент1 = NULL, Элемент2 = NULL, Элемент3 = NULL, Элемент4 = NULL, Элемент5 = NULL, + Элемент6 = NULL, Элемент7 = NULL, Элемент8 = NULL, Элемент9 = NULL, Элемент10 = NULL, + Элемент11 = NULL, Элемент12 = NULL, Элемент13 = NULL, Элемент14 = NULL, Элемент15 = NULL, + Элемент16 = NULL, Элемент17 = NULL, Элемент18 = NULL, Элемент19 = NULL, Элемент20 = NULL, + Элемент21 = NULL, Элемент22 = NULL, Элемент23 = NULL, Элемент24 = NULL, Элемент25 = NULL, + Элемент26 = NULL, Элемент27 = NULL, Элемент28 = NULL, Элемент29 = NULL, Элемент30 = NULL, + Элемент31 = NULL, Элемент32 = NULL + // BSLLS:NumberOfParams-on + // BSLLS:NumberOfOptionalParams-on + ) Экспорт + + Коллекция = Новый Массив; + Для сч = 1 По 32 Цикл + ДобавитьНеПустоеЗначениеВКоллекцию(Коллекция, Вычислить("Элемент" + сч)); + КонецЦикла; + + ПроцессорКоллекций = Новый ПроцессорКоллекций(); + ПроцессорКоллекций.УстановитьКоллекцию(Коллекция); + + Возврат ПроцессорКоллекций; + +КонецФункции + // Стандартная функция сравнения. // Сравнивает значения элементов коллекции через операторы ">", "<" и "=". // @@ -75,3 +144,9 @@ ФункцияОбработки = Новый ОписаниеОповещения("ФункцияОбработки_Сообщить", ПроцессорыКоллекцийСлужебный); Возврат ФункцияОбработки; КонецФункции + +Процедура ДобавитьНеПустоеЗначениеВКоллекцию(Коллекция, Значение) + Если Значение <> NULL Тогда + Коллекция.Добавить(Значение); + КонецЕсли; +КонецПроцедуры diff --git "a/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" "b/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" index af19970..af46640 100644 --- "a/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" +++ "b/tests/\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" @@ -9,6 +9,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекций"); ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзСтрокиЧерезПомощник"); + ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзНабораЧерезПомощник"); Возврат ВсеТесты; @@ -26,4 +27,10 @@ Процедура ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзСтрокиЧерезПомощник() Экспорт ПроцессорКоллекций = ПроцессорыКоллекций.ИзСтроки(""); Ожидаем.Что(ПроцессорКоллекций).ИмеетТип("ПроцессорКоллекций"); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +Процедура ТестДолжен_ПроинициализироватьПроцессорКоллекцийИзНабораЧерезПомощник() Экспорт + ПроцессорКоллекций = ПроцессорыКоллекций.ИзНабора(1, 2, 3); + Ожидаем.Что(ПроцессорКоллекций).ИмеетТип("ПроцессорКоллекций"); + Ожидаем.Что(ПроцессорКоллекций.Количество()).Равно(3); +КонецПроцедуры diff --git "a/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" "b/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" index 1da91f2..f3213d0 100644 --- "a/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" +++ "b/tests/\320\232\320\276\320\275\320\262\320\265\320\271\320\265\321\200\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" @@ -34,8 +34,10 @@ ВсеТесты.Добавить("ТестДолжен_ПропуститьНесколькоЭлементов"); ВсеТесты.Добавить("ТестДолжен_ПолучитьРазличныеЭлементы"); ВсеТесты.Добавить("ТестДолжен_ПолучитьУвеличитьВсеЭлементыНаЕдиницуЧерезОбработку"); + ВсеТесты.Добавить("ТестДолжен_СобратьДваПроцессораВОдин"); ВсеТесты.Добавить("ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух"); ВсеТесты.Добавить("ТестДолжен_ОтсортироватьЭлементы"); + ВсеТесты.Добавить("ТестДолжен_ОтсортироватьТаблицуПоКолонке"); // ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); @@ -85,6 +87,21 @@ КонецЦикла; КонецПроцедуры +Процедура ТестДолжен_СобратьДваПроцессораВОдин() Экспорт + + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + Результат = ПроцессорКоллекций.Развернуть( + "Массив = Новый Массив; + |Массив.Добавить(Элемент); + |Массив.Добавить(Элемент + 1); + |Результат = ПроцессорыКоллекций.ИзКоллекции(Массив)" + ).Фильтровать("Результат = Элемент = 2") + .Количество(); + + Ожидаем.Что(Результат, "Процессоры коллекций должны сложиться и отфильтроваться").Равно(3); + +КонецПроцедуры + Процедура ТестДолжен_ОтфильтроватьЭлементыМеньшеДвух() Экспорт ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); Результат = ПроцессорКоллекций.Фильтровать("Результат = Элемент < 2").ВМассив(); @@ -102,3 +119,19 @@ ПредыдущийЭлемент = Макс(Элемент, ПредыдущийЭлемент); КонецЦикла; КонецПроцедуры + +Процедура ТестДолжен_ОтсортироватьТаблицуПоКолонке() Экспорт + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число")); + + Таблица.Добавить().НомерСтроки = 2; + Таблица.Добавить().НомерСтроки = 3; + Таблица.Добавить().НомерСтроки = 1; + + ПроцессорКоллекций = ПроцессорыКоллекций.ИзКоллекции(Таблица); + Результат = ПроцессорКоллекций.СортироватьПо("НомерСтроки").ВМассив(); + + Для сч = 0 По Таблица.Количество() - 1 Цикл + Ожидаем.Что(Таблица[сч].НомерСтроки = сч); + КонецЦикла; +КонецПроцедуры diff --git "a/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" "b/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" index 5d0a1a5..a664b70 100644 --- "a/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" +++ "b/tests/\320\242\320\265\321\200\320\274\320\270\320\275\320\260\320\273\321\214\320\275\321\213\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" @@ -1,4 +1,5 @@ #Использовать asserts +#Использовать notify #Использовать ".." @@ -20,6 +21,10 @@ КонецФункции +Процедура ФункцияОбработкиСПроверкойДопПараметров(Результат, ДополнительныеПараметры) Экспорт + Результат = ДополнительныеПараметры.ПроверяемыйПараметр; +КонецПроцедуры + // основной метод для тестирования Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт @@ -41,6 +46,8 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЛюбойСоответствует"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВсеСоответствуют"); ВсеТесты.Добавить("ТестДолжен_ПроверитьВсеНеСоответствуют"); + + ВсеТесты.Добавить("ТестДолжен_ПроверитьПробросДополнительныхПараметровВОповещениеДляКаждого"); // ВсеТесты.Добавить("ТестДолжен_ПроинициализироватьПроцессорКоллекцийЧерезПомощник"); @@ -198,3 +205,25 @@ Результат = ПроцессорКоллекций.ВсеНеСоответствуют("Результат = Элемент > 2"); Ожидаем.Что(Результат).ЭтоЛожь(); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПробросДополнительныхПараметровВОповещениеДляКаждого() Экспорт + ПроцессорКоллекций = ПолучитьПроцессорКоллекций(); + + ДополнительныеПараметры = Новый Структура("ПроверяемыйПараметр"); + ФункцияОбработки = Новый ОписаниеОповещения( + "ФункцияОбработкиСПроверкойДопПараметров", + ЭтотОбъект, + ДополнительныеПараметры + ); + + // Ожидаем, что все варианты не выкинут исключения + ПроцессорКоллекций.ДляКаждого(ФункцияОбработки); + ПроцессорКоллекций.ДляКаждого("Результат = ДополнительныеПараметры.ПроверяемыйПараметр;", ДополнительныеПараметры); + + ФункцияОбработки = Новый ОписаниеОповещения( + "ФункцияОбработкиСПроверкойДопПараметров", + ЭтотОбъект + ); + ПроцессорКоллекций.ДляКаждого(ФункцияОбработки, ДополнительныеПараметры); + +КонецПроцедуры diff --git a/travis.sh b/travis.sh index 780b3bc..b694285 100755 --- a/travis.sh +++ b/travis.sh @@ -1,25 +1,16 @@ #!/bin/bash set -e -oscript /usr/share/oscript/lib/opm/src/opm.os run coverage +oscript ./tasks/coverage.os 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=http://sonar.silverbulleters.org \ - -Dsonar.analysis.mode=issues \ - -Dsonar.github.pullRequest=$TRAVIS_PULL_REQUEST \ - -Dsonar.github.repository=$TRAVIS_REPO_SLUG \ - -Dsonar.github.oauth=$SONAR_GITHUB_TOKEN \ - -Dsonar.login=$SONAR_TOKEN \ - -Dsonar.scanner.skip=false + if [ "$TRAVIS_BRANCH" == "develop" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then - elif [ "$TRAVIS_BRANCH" == "develop" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then sonar-scanner \ - -Dsonar.host.url=http://sonar.silverbulleters.org \ + -Dsonar.host.url=$SONAR_HOST \ -Dsonar.login=$SONAR_TOKEN \ -Dsonar.projectVersion=$version\ -Dsonar.scanner.skip=false