-
Notifications
You must be signed in to change notification settings - Fork 1
[WIP] Сериализация настроек бенчмарков #28
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
WalkthroughReplaces CLI flag Changes
Sequence Diagram(s)sequenceDiagram
participant CLI as User/CLI
participant Cmd as КомандаЗапуска
participant FS as ФайлНастроек
participant Ser as СериализаторНастроекБенчмарков
participant DTO as НастройкиБенчмарковДто
participant Types as ПодключённыеТипы
participant Launcher as ЗапускательБенчмарков
CLI->>Cmd: run --settings path
Cmd->>Cmd: ПодключитьТипы()
Cmd->>FS: read settings file path
FS->>Ser: file content
Ser->>DTO: ПрочитатьИзJson(файл) → НастройкиDTO
DTO-->>Cmd: Возврат Настроек (дескрипторы + конфигурация)
Cmd->>Cmd: ПрочитатьКонфигурацию(Настройки)
Cmd->>Types: iterate connected types
Cmd->>Launcher: launch per-type with merged config (try/catch)
Launcher-->>Cmd: results / errors (logged)
sequenceDiagram
participant JSON as JSON text
participant Deser as ДесериализаторJsonBench
participant Reflect as Рефлектор
participant Obj as TargetObject
JSON->>Deser: Десериализовать(строка, Тип)
Deser->>Reflect: получить свойства и аннотации
Reflect-->>Deser: metadata
Deser->>Obj: создать объект и установить свойства
Deser->>Obj: вызвать ПослеДесериализации()
Obj->>Obj: вызвать Валидировать()
Obj-->>Deser: готовый объект
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
src/BenchmarkOneScript/core/Модули/ИзвлекательКонфигурацииБенчмарков.os (1)
37-44: Bug: wrong config variable passed; can cause NPE and lost settings.
Конфигурация(input, possibly Неопределено) is passed into readers instead ofКонфигурацияБенчмарков. This can throw at runtime and/or not apply settings to the returned object.Apply this fix:
- ПрочитатьАннотацииКолонок(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюКаталогАртефактов(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортMarkdown(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортJson(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортXml(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортHtml(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюИсполняющаяСреда(СвойстваКонструктора, Конфигурация); + ПрочитатьАннотацииКолонок(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюКаталогАртефактов(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортMarkdown(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортJson(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортXml(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортHtml(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюИсполняющаяСреда(СвойстваКонструктора, КонфигурацияБенчмарков);- ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередВсеми, РефлекторОбъекта, Конфигурация); - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеВсех, РефлекторОбъекта, Конфигурация); - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередКаждым, РефлекторОбъекта, Конфигурация); - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеКаждого, РефлекторОбъекта, Конфигурация); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередВсеми, РефлекторОбъекта, КонфигурацияБенчмарков); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеВсех, РефлекторОбъекта, КонфигурацияБенчмарков); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередКаждым, РефлекторОбъекта, КонфигурацияБенчмарков); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеКаждого, РефлекторОбъекта, КонфигурацияБенчмарков);Also applies to: 51-55
src/BenchmarkOneScript/core/Классы/СериализаторРезультатовБенчмарков.os (1)
386-389: Неправильная логика проверки существования набора параметров + нестрогое сравнениеФункция ОтсутствуетНаборПараметровБенчмарка возвращает результат, зависящий от последнего набора, а не от наличия точного совпадения; возможны дубликаты. Также сравнение через «Не A = B» неочевидно.
-Функция ОтсутствуетНаборПараметровБенчмарка(ДескрипторБенчмарка, ПараметрыМетода) - - НайденНабор = Ложь; - Для Каждого НаборПараметров Из ДескрипторБенчмарка.НаборыПараметров() Цикл - НайденНабор = Истина; - МассивПараметров = НаборПараметров.ВМассив(); - Для Инд = 0 По МассивПараметров.ВГраница() Цикл - Если Не МассивПараметров[Инд].Значение = ПараметрыМетода[Инд] Тогда - НайденНабор = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - Возврат Не НайденНабор; -КонецФункции +Функция ОтсутствуетНаборПараметровБенчмарка(ДескрипторБенчмарка, ПараметрыМетода) + Для Каждого НаборПараметров Из ДескрипторБенчмарка.НаборыПараметров() Цикл + МассивПараметров = НаборПараметров.ВМассив(); + // Строгая проверка длины + Если МассивПараметров.Количество() <> ПараметрыМетода.Количество() Тогда + Продолжить; + КонецЕсли; + Совпадает = Истина; + Для Инд = 0 По ПараметрыМетода.ВГраница() Цикл + Если МассивПараметров[Инд].Значение <> ПараметрыМетода[Инд] Тогда + Совпадает = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Если Совпадает Тогда + Возврат Ложь; // набор уже существует + КонецЕсли; + КонецЦикла; + Возврат Истина; // такого набора нет +КонецФункцииДополнительно: в ЗаполнитьПараметрыВСтроке (Линии 386-389) перед добавлением набора стоит убедиться, что ПараметрыМетода заполнены полностью, иначе появятся «пустые» наборы.
Also applies to: 398-407
tests/ТестыКонфигурации.os (1)
541-545: Незадействованная переменная «Процентили» — тест не проверяет 33% колонкуСоздаёте Процентили и добавляете 33, но итерируете снова ПроцентилиПоУмолчанию(), из‑за чего колонка 33% не проверяется.
-Процентили = КолонкаОтчетаБенчмарковПроцентиль.ПроцентилиПоУмолчанию(); -Процентили.Добавить(33); - -Для Каждого Процентиль Из КолонкаОтчетаБенчмарковПроцентиль.ПроцентилиПоУмолчанию() Цикл +Процентили = КолонкаОтчетаБенчмарковПроцентиль.ПроцентилиПоУмолчанию(); +Процентили.Добавить(33); +Для Каждого Процентиль Из Процентили Цикл
🧹 Nitpick comments (23)
tests/ТестыЭталонов.os (1)
1-1: Scope the LineLength suppression.Prefer limiting
// BSLLS:LineLength-offto specific long blocks and re-enabling afterwards to avoid masking unrelated issues.src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарковИзКаталога.os (1)
68-71: Log more context on failures (file and stack).Include the script path and stack to speed up troubleshooting.
Apply this diff:
- _Лог.Ошибка("Возникла ошибка при запуске бенчмарков <%1>: %2", - СтрокаРезультата.ИмяКласса, - ОписаниеОшибки()); + Ошибка = ИнформацияОбОшибке(); + _Лог.Ошибка("Ошибка при запуске бенчмарков <%1> (%2): %3", + СтрокаРезультата.ИмяКласса, + СтрокаРезультата.ПолноеИмяФайла, + ОписаниеОшибки()); + Если ТипЗнч(Ошибка) = Тип("ИнформацияОбОшибке") Тогда + _Лог.Отладка("Стек: %1", Ошибка.Текст); + КонецЕсли;src/BenchmarkOneScript/core/Классы/ЭкспортерРезультатовБенчмарковВJson.os (1)
11-11: Ensure artifacts directory exists before writing.Without a pre-created directory, write may fail.
Apply this diff:
КаталогАртефактов = РезультатыБенчмарков.Конфигурация.КаталогАртефактов(); + СоздатьКаталог(КаталогАртефактов); ПутьКФайлу = ОбъединитьПути(КаталогАртефактов, РезультатыБенчмарков.ИмяКласса + "-report." + Расширение());src/BenchmarkOneScript/dto/Классы/НастройкиБенчмарковДто.os (1)
3-6: Initialize DTO fields to avoidНеопределеноat runtime.Serializers/consumers may not handle
Неопределено.Apply this addition:
+Процедура ПриСозданииОбъекта() + Если ДескрипторыБенчмарков = Неопределено Тогда + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); + КонецЕсли; + Если Конфигурация = Неопределено Тогда + Конфигурация = Новый КонфигурацияБенчмарков(); + КонецЕсли; +КонецПроцедурыOptionally align name to
...Dtofor consistency across DTOs.Also applies to: 7-9
src/BenchmarkOneScript/core/Модули/ИзвлекательКонфигурацииБенчмарков.os (2)
23-24: Minor: avoid empty argument for readability.Pass
Неопределеноexplicitly.- ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов(, Ложь); + ТаблицаМетодов = РефлекторОбъекта.ПолучитьТаблицуМетодов(Неопределено, Ложь);
14-21: Optional: rename local to reduce shadowing.
Конфигурация(param) vsКонфигурацияБенчмарков(local) invites mistakes (like the bug above). Rename local toРезультатКонфигурацииor similar.src/BenchmarkOneScript/core/Классы/ПараметрБенчмарка.os (1)
7-12: Добавьте базовую валидацию конструктора.Текущие значения по умолчанию ок. Рекомендую явно валидировать тип и непустоту имени (особенно при пЭтоПараметрМетода=Истина) — это раннее обнаружение ошибок конфигурации.
Процедура ПриСозданииОбъекта(пИмя = "", пЗначение = Неопределено, пЭтоПараметрМетода = Ложь) + // Бюджетная валидация без зависимостей; при желании используйте пакет validate + Если ТипЗнч(пИмя) <> Тип("Строка") Тогда + ВызватьИсключение "Имя параметра должно быть строкой"; + КонецЕсли; + Если пЭтоПараметрМетода И ПустаяСтрока(пИмя) Тогда + ВызватьИсключение "Имя параметра метода не может быть пустым"; + КонецЕсли; + Имя = пИмя; Значение = пЗначение; ЭтоПараметрМетода = пЭтоПараметрМетода;src/BenchmarkOneScript/core/Классы/КоллекцияДескрипторовБенчмарков.os (2)
18-20: Инициализация через Прочитать в конструкторе: обработайте сбой извлечения.Если извлечение бросит исключение, объект останется частично сконструирован. Перехватите/оберните ошибку с контекстом.
- Если Не ИсточникБенчмарков = Неопределено Тогда - Прочитать(ИсточникБенчмарков); - КонецЕсли; + Если ИсточникБенчмарков <> Неопределено Тогда + Попытка + Прочитать(ИсточникБенчмарков); + Исключение + ВызватьИсключение "Не удалось прочитать дескрипторы: " + ОписаниеОшибки(); + КонецПопытки; + КонецЕсли;
131-139: Сделайте Прочитать() возвращающей ЭтотОбъект для чейнинга.Это повысит удобство API и согласуется со стилем fluent.
-Процедура Прочитать(ИсточникБенчмарков) Экспорт +Функция Прочитать(ИсточникБенчмарков) Экспорт Очистить(); ИзвлекательДескрипторовБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); -КонецПроцедуры + Возврат ЭтотОбъект; +КонецФункцииТакже подтвердите, что используемый сериализатор умеет сериализовать приватные поля с &Сериализуемое (без Экспорт). Если нет — стоит пометить _ДескрипторыБенчмарков как Экспорт.
tests/ТестыБенчмарков.os (1)
761-763: Обновлённые имена API JSON-serializer — ок; добавьте защиту на IOВызовы ЗаписатьВJson/ПрочитатьИзJson корректны. Рекомендую обернуть открытие/закрытие файлов в try/finally, чтобы гарантированно закрывать дескрипторы при исключениях.
-ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); -ЗаписьJSON.ЗаписатьБезОбработки(...); -ЗаписьJSON.Закрыть(); +Попытка + ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); + ЗаписьJSON.ЗаписатьБезОбработки(...); +Исключение + // при необходимости лог +КонецПопытки; +Если ЗначениеЗаполнено(ЗаписьJSON) Тогда ЗаписьJSON.Закрыть(); КонецЕсли;src/BenchmarkOneScript/core/Классы/СериализаторРезультатовБенчмарков.os (2)
24-39: Переименование метода записи в JSON — ок; добавьте try/finallyЛогика записи не гарантирует закрытие файла при ошибке. Оберните операции в try/finally.
-ЗаписьJSON.ОткрытьФайл(ПолноеИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); -ЗаписатьJSON(ЗаписьJSON, Данные); -ЗаписьJSON.Закрыть(); +Попытка + ЗаписьJSON.ОткрытьФайл(ПолноеИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); + ЗаписатьJSON(ЗаписьJSON, Данные); +Исключение + // _Лог.Ошибка(...) по желанию +КонецПопытки; +Если ЗначениеЗаполнено(ЗаписьJSON) Тогда ЗаписьJSON.Закрыть(); КонецЕсли;
51-64: Переименование метода чтения из JSON — ок; закройте файл в finallyЗакрытие ЧтениеJSON не защищено на исключения. Оберните в try/finally.
-ЧтениеJSON.ОткрытьФайл(ПолноеИмяФайла, "UTF-8"); -Данные = ПрочитатьJSON(ЧтениеJSON, Ложь); -ЧтениеJSON.Закрыть(); +Попытка + ЧтениеJSON.ОткрытьФайл(ПолноеИмяФайла, "UTF-8"); + Данные = ПрочитатьJSON(ЧтениеJSON, Ложь); +Исключение + // _Лог.Ошибка(...) по желанию +КонецПопытки; +Если ЗначениеЗаполнено(ЧтениеJSON) Тогда ЧтениеJSON.Закрыть(); КонецЕсли;tests/ТестыКонфигурации.os (1)
748-792: Расширенная проверка конфигурации — ок; мелкие улучшенияПроверки полные и читаемые. Мелкие доработки:
- В сообщениях об ожиданиях стоит унифицировать «Обработчики»/«Обработчики событий».
- Для устойчивости тестов на версии исполняющей среды предпочтите поиск по значению вместо индексов (если порядок в будущем изменится).
src/BenchmarkOneScript/core/Модули/КомбинаторПараметровБенчмарка.os (2)
32-49: Нормализация входных типов — ок; добавьте валидацию содержимого массивовСейчас для Массив предполагается, что элементы — ПараметрБенчмарка. Имеет смысл явно проверять тип элементов и бросать понятную ошибку.
-ИначеЕсли ТипЭлемента = Тип("Массив") Или ТипЭлемента = Тип("ПараметрыМетодаБенчмарка") Тогда +ИначеЕсли ТипЭлемента = Тип("Массив") Или ТипЭлемента = Тип("ПараметрыМетодаБенчмарка") Тогда ... + // валидация содержимого массива (не для ПараметрыМетодаБенчмарка, т.к. он сам типизирован) + Если ТипЭлемента = Тип("Массив") Тогда + Для Каждого Э Из Параметр Цикл + Если ТипЗнч(Э) <> Тип("ПараметрБенчмарка") Тогда + ВызватьИсключение СтрШаблон("Ожидался ПараметрБенчмарка внутри массива, получено <%1>", ТипЗнч(Э)); + КонецЕсли; + КонецЦикла; + КонецЕсли;
77-123: Комбинатор групп — ок; сложность приемлемаАлгоритм Картежи×Группы реализован правильно. При необходимости можно микроподправить копирование комбинаций через .Скопировать() (если доступно) для читаемости.
src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os (1)
20-39: Запись настроек в JSON — ок; добавьте try/finally и проверку каталога
- Оберните работу с файлом в try/finally для гарантированного закрытия.
- Убедитесь, что каталог для ИмяФайла существует (создайте при необходимости).
-ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); -ЗаписьJSON.ЗаписатьБезОбработки(...); -ЗаписьJSON.Закрыть(); +// ФС.СоздатьКаталог(ПолучитьКаталог(ИмяФайла)); // если требуется +Попытка + ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); + ЗаписьJSON.ЗаписатьБезОбработки(...); +Исключение + // _Лог.Ошибка(...) по желанию +КонецПопытки; +Если ЗначениеЗаполнено(ЗаписьJSON) Тогда ЗаписьJSON.Закрыть(); КонецЕсли;src/BenchmarkOneScript/core/Модули/Компаратор.os (1)
51-66: Consider checking for key existence.The function doesn't verify that keys from
Соответствие1exist inСоответствие2before comparing values. If a key is missing,Соответствие2[Ключ]will returnНеопределено, which may not be the intended behavior.Consider adding a key existence check:
Для Каждого КлючЗначение Из Соответствие1 Цикл Ключ = КлючЗначение.Ключ; + Если Соответствие2[Ключ] = Неопределено И Не Соответствие1[Ключ] = Неопределено Тогда + Возврат Ложь; + КонецЕсли; Если Не Совпадают(Соответствие1[Ключ], Соответствие2[КлючЗначение.Ключ]) Тогда Возврат Ложь; КонецЕсли; КонецЦикла;src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os (2)
117-154: Типы столбцов ТаблицыЗначений игнорируютсяАргумент ТипЭлементов не используется; все значения десериализуются по их фактическому типу. Это ломает строгую схему и симметрию с сериализацией.
Минимально: если ТипЭлементов передан как массив типов той же длины, приводить значения по колонкам:
- ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(ЗначениеКолонки, ТипЗнч(ЗначениеКолонки)); + ОжидаемыйТипКолонки = ?(ЗначениеЗаполнено(ТипЭлементов) И ТипЗнч(ТипЭлементов)=Тип("Массив") И ИндексКолонки < ТипЭлементов.Количество(), ТипЭлементов[ИндексКолонки], ТипЗнч(ЗначениеКолонки)); + ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(ЗначениеКолонки, ОжидаемыйТипКолонки);
183-191: Неизвестные поля пользовательских типов молча игнорируютсяСейчас поля без соответствия в классе просто пропускаются. Это затрудняет поиск ошибок конфигурации/опечаток.
Добавьте настраиваемую строгость (флаг в модуле/параметр функции) и как минимум логируйте на уровне предупреждения:
- // Если поле не найдено, то пропускаем его - // TODO: Падать, если не висит @JsonIgnore - Продолжить; + Лог.Предупреждение("Поле '%1' отсутствует в типе %2 и будет проигнорировано", КлючИЗначение.Ключ, ТипОбъекта); + Продолжить;Опционально — выбрасывать исключение в строгом режиме.
src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os (2)
218-233: Парсинг экспортеров: принять 'md' и нормализовать вводОписание CLI обещает 'md', но маппинг ждёт 'markdown'. Также разделение по ", " ломается без пробела.
- Сплит по ',' без пробела.
- Трим пробелы и нормализуйте регистр.
- Добавьте синоним 'md'.
- ДопустимыеЗначения.Вставить("markdown", "Markdown"); + ДопустимыеЗначения.Вставить("markdown", "Markdown"); + ДопустимыеЗначения.Вставить("md", "Markdown"); ... - Для Каждого Экспортер Из СтрРазделить(_Экспортеры, ", ", Ложь) Цикл - - Имя = ДопустимыеЗначения[НРег(Экспортер)]; + Для Каждого СыройЭкспортер Из СтрРазделить(_Экспортеры, ",", Ложь) Цикл + Экспортер = НРег(СтрЗаменить(СыройЭкспортер, " ", "")); + Имя = ДопустимыеЗначения[Экспортер];
104-113: Чтение настроек без обработки ошибокИсключения из ПрочитатьИзJson завершат команду целиком без контекста.
Добавьте обработку для улучшения UX:
Функция ПрочитатьНастройки() Если Не ЗначениеЗаполнено(_ФайлНастроек) Тогда Возврат Неопределено; КонецЕсли; - Сериализатор = Новый СериализаторНастроекБенчмарков(); - Возврат Сериализатор.ПрочитатьИзJson(_ФайлНастроек); + Сериализатор = Новый СериализаторНастроекБенчмарков(); + Попытка + Возврат Сериализатор.ПрочитатьИзJson(_ФайлНастроек); + Исключение + _Лог.Ошибка("Не удалось прочитать файл настроек <%1>: %2", _ФайлНастроек, ОписаниеОшибки()); + Возврат Неопределено; + КонецПопытки; КонецФункцииsrc/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os (1)
6-7: Лишняя зависимостьcollectionos не используется в модуле.
Удалите импорт для уменьшения связности:
-#Использовать collectionossrc/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os (1)
1148-1156: Сериализация обработчиков: типы-делегаты не поддерживаютсяСейчас бросаете исключение, если Обработчик не строка. Это делает сериализацию неснимемой при программной конфигурации.
Оставить как есть, но улучшить сообщение: добавить имя события и подсказку использовать строковые имена. Или конвертировать Делегат в строку-имя при наличии .ИмяМетода().
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (28)
docs/CLI.md(1 hunks)packagedef(4 hunks)src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os(4 hunks)src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os(8 hunks)src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.os(8 hunks)src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарковИзКаталога.os(1 hunks)src/BenchmarkOneScript/core/Классы/КоллекцияДескрипторовБенчмарков.os(3 hunks)src/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os(12 hunks)src/BenchmarkOneScript/core/Классы/ПараметрБенчмарка.os(1 hunks)src/BenchmarkOneScript/core/Классы/ПараметрыМетодаБенчмарка.os(1 hunks)src/BenchmarkOneScript/core/Классы/СериализаторКонфигурацииБенчмарков.os(0 hunks)src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os(1 hunks)src/BenchmarkOneScript/core/Классы/СериализаторРезультатовБенчмарков.os(3 hunks)src/BenchmarkOneScript/core/Классы/ЭкспортерРезультатовБенчмарковВJson.os(1 hunks)src/BenchmarkOneScript/core/Модули/ИзвлекательДескрипторовБенчмарков.os(1 hunks)src/BenchmarkOneScript/core/Модули/ИзвлекательКонфигурацииБенчмарков.os(1 hunks)src/BenchmarkOneScript/core/Модули/КомбинаторПараметровБенчмарка.os(4 hunks)src/BenchmarkOneScript/core/Модули/Компаратор.os(1 hunks)src/BenchmarkOneScript/dto/Классы/НастройкиБенчмарковДто.os(1 hunks)src/BenchmarkOneScript/jason/Классы/АннотацияНесериализуемое.os(1 hunks)src/BenchmarkOneScript/jason/Классы/АннотацияСериализуемое.os(1 hunks)src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os(1 hunks)src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os(1 hunks)tests/fixtures/Классы/БенчмаркСАннотациямиКонфигурации.os(1 hunks)tests/ТестыБенчмарков.os(3 hunks)tests/ТестыКонфигурации.os(2 hunks)tests/ТестыСериализаторБенчмарков.os(1 hunks)tests/ТестыЭталонов.os(1 hunks)
💤 Files with no reviewable changes (1)
- src/BenchmarkOneScript/core/Классы/СериализаторКонфигурацииБенчмарков.os
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: sonar / test
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: sonar / test
🔇 Additional comments (39)
src/BenchmarkOneScript/jason/Классы/АннотацияНесериализуемое.os (1)
1-9: Annotation looks correct.Declaration is minimal and consistent with annotation pattern.
Please add/confirm a test where a field marked
&Несериализуемоеis excluded even if&Сериализуемоеis present elsewhere in the type.src/BenchmarkOneScript/core/Модули/ИзвлекательДескрипторовБенчмарков.os (2)
3-3: Good: explicit reflector import.Keeps dependency clear and avoids implicit availability issues.
10-10: Param doc clarification LGTM.Accepts both type and instance; matches
РефлекторОбъектаusage.src/BenchmarkOneScript/core/Модули/ИзвлекательКонфигурацииБенчмарков.os (1)
2-2: Reflector import LGTM.Aligns with new reflection-based extraction.
docs/CLI.md (1)
26-26: Review comment is incorrect and should be disregarded.The review references deprecating
-cand--configCLI flags, but these flags do not exist in the codebase. The complete CLI flag list indocs/CLI.md(lines 15-26) shows only:--iterationCount,--iterationTime,--warmupCount,--invocationCount,--runtime,--throughput,--coldstart,-m/--memory,-e/--exporters,-a/--artifacts,-r/--recursive, and--settings. The codebase already uses--settingsexclusively (e.g., insrc/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.oslines 196-197). No references to-cor--configas CLI flags were found anywhere in the code.Likely an incorrect or invalid review comment.
tests/fixtures/Классы/БенчмаркСАннотациямиКонфигурации.os (1)
43-46: Параметры и источник: проверьте наличие источника и согласованность контракта.
- В файле нет реализации функций-источников «ПолучитьПараметры»/«ПолучитьЗначения». Если фикстура реально вызывается извлекателем, добавьте заглушку или переименуйте атрибут под существующую функцию.
- Уточните приоритет: как объединяются &Параметры на уровне класса (стр. 1) и метода (стр. 43–45)? Избегите дублирования/конфликтов.
- Метод «Бенчмарк(Парам)» — параметр не используется. Убедитесь, что извлекатель/раннер не требует соответствия числу аннотированных параметров.
Можно подтвердить контрактом/тестом, что извлекатель корректно работает при отсутствии источника в этой фикстуре?
src/BenchmarkOneScript/core/Классы/КоллекцияДескрипторовБенчмарков.os (2)
3-6: Аннотации сериализации на поле коллекции — LGTM.Хорошо, что задано имя «Элементы», тип и итерация для сериализации.
55-59: Очистить() — уместно.Простая и ожидаемая операция для переиспользования коллекции.
packagedef (2)
10-10: Адрес репозитория — отлично.Добавление .АдресРепозитория улучшает метаданные пакета.
21-38: Verify compatibility of dependency updates with OneScript 1.9.3.The packages are actively used in the codebase:
reflector(0.7.1): ДескрипторБенчмарка.os, КонфигурацияБенчмарков.os, ИзвлекательКонфигурацииБенчмарков.os, ИзвлекательДескрипторовБенчмарков.osvalidate(0.3.0): ДесериализаторJsonBench.os, ДескрипторБенчмарка.os, КонфигурацияБенчмарков.oscollectionos(0.8.2): СериализаторJsonBench.osConfirm:
- Minimum OneScript engine version for reflector 0.7.1, collectionos 0.8.2, validate 0.3.0 supports OneScript 1.9.3
- Packages are available in OneScript OPM registry
- No known security vulnerabilities in these versions
tests/ТестыБенчмарков.os (2)
156-156: Переход на объектную модель параметров подтверждёнИспользование НаборыПараметров[0].Получить(0).ЭтоПараметрМетода выглядит корректно и соответствует новой модели.
775-779: Актуализированные проверки значений параметровПереход на .Получить(i).Значение согласован с новой структурой набора параметров.
tests/ТестыКонфигурации.os (1)
14-16: Переименование helper‑процедуры — окВызов ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(…) соответствует новой экспортируемой процедуре.
src/BenchmarkOneScript/core/Модули/КомбинаторПараметровБенчмарка.os (2)
7-9: Поддержка ПараметрыМетодаБенчмарка — окДокстринг и контракт обновлены корректно.
131-138: Обработка ПараметрыМетодаБенчмарка встраивается корректноДелегирование на ДобавитьПараметрыВКомбинацию с Параметр.ВМассив() — верно.
src/BenchmarkOneScript/core/Классы/ПараметрыМетодаБенчмарка.os (4)
1-11: LGTM!The serialization annotations and constructor are correctly implemented. The use of
&Сериализуемоеwith&Тип("Массив")and&ДляКаждогоproperly defines the collection structure for serialization.
13-24: LGTM!The validation logic correctly ensures that only
ПараметрБенчмаркаinstances withЭтоПараметрМетода = Истинаare added to the collection. This maintains the integrity of the parameter collection.
26-43: LGTM!Standard accessor methods with proper documentation. The implementation correctly delegates to the internal array.
45-51: LGTM!The method creates a defensive copy by wrapping the internal array in a
ФиксированныйМассивand then a newМассив. This prevents external modifications from affecting the collection's internal state while providing a usable array to callers.tests/ТестыСериализаторБенчмарков.os (3)
1-18: LGTM!Standard test setup with proper resource management. The temporary file manager is correctly initialized in setup and cleaned up in teardown.
20-36: LGTM!The test correctly validates the serialization roundtrip by writing to JSON and reading back, then verifying the structure. This is the right approach for testing serialization fidelity.
61-104: LGTM!Comprehensive validation of the deserialized configuration. The test covers exporters, runtime versions, columns, parameters, event handlers, and artifact paths. Well-structured test helper.
src/BenchmarkOneScript/core/Модули/Компаратор.os (3)
35-49: LGTM!The array comparison correctly short-circuits on count mismatch and recursively compares elements. The use of
Совпадаютfor recursive comparison supports nested structures.
68-87: LGTM!The structure comparison correctly checks for property existence in the second structure using
Свойство()before comparing values. This is the right approach for structure comparison.
89-114: LGTM!The table comparison logic is well-structured. It validates column structure first, then performs row-by-row comparison. The column existence check at lines 96-100 prevents runtime errors.
src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.os (6)
196-198: LGTM!The CLI flag change from
--configto--settingsaligns with the PR objectives and the updated documentation in docs/CLI.md.
241-250: LGTM!Correct usage of the new
СериализаторНастроекБенчмарковclass and itsЗаписатьВJsonmethod. The serialization includes both descriptors and configuration as required.
280-295: LGTM!The updated deserialization call passes
_КонфигурацияtoПрочитатьИзJson, which provides necessary context for deserializing benchmark results.
685-717: LGTM!The conversion logic correctly wraps parameters in the new
ПараметрыМетодаБенчмаркаcollection type. The type dispatch handles arrays, structures, maps, and table rows appropriately.
719-741: LGTM!The array-to-parameters conversion properly validates parameter count and creates individual
ПараметрБенчмаркаinstances for each array element, wrapping them in the collection.
743-796: LGTM!Both conversion helpers (
ПреобразоватьСтруктуруВПараметрыМетодаБенчмаркаandПреобразоватьСтрокуТаблицыЗначенийВПараметрыМетодаБенчмарка) correctly validate parameter presence and create properly structured parameter collections. The consistent pattern across all conversion helpers makes the code maintainable.src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os (6)
1-35: LGTM!The serialization annotations are well-structured. Marking
_ИменаПараметровas&Несериализуемоеis correct since this derived data is re-extracted duringПослеДесериализации().
96-143: LGTM!The refactoring to use
ПараметрыМетодаБенчмаркаcorrectly groups parameters into sets. Both array and single-value cases are handled appropriately, maintaining backward compatibility in behavior while changing the internal structure.
272-278: LGTM!The post-deserialization hook correctly validates the deserialized data and reconstructs derived state (
_ИменаПараметров). Creating a new instance viaНовый(_Тип)for reflection is the appropriate approach.
285-294: LGTM!The parameter name extraction uses reflection appropriately to get method metadata and extract parameter names. This is a clean implementation.
296-305: LGTM!The validation procedure correctly uses the
validatelibrary to validate the descriptor state and provides clear error messages viaОписаниеОшибокВалидации.
44-57: No breaking change - constructor signature change is backward compatible.Both existing calls to the constructor in the codebase pass exactly two arguments that map to the parameters. Making
ОбъектandМетодoptional with defaults does not break these calls—they continue working as before. The change safely enables the new deserialization pattern without affecting existing code.src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os (1)
137-141: Неизвестные пользовательские типы: только предупреждение, результат НеопределеноЭто может дать "null" в JSON без явной ошибки на стороне вызывающего кода.
Подтвердите желаемую политику. Варианты:
- Строгий режим: бросать исключение.
- Мягкий: оставлять предупреждение, но также включать имя типа в выход (напр., объект-обёртку с метаданными).
Если нужен строгий режим — могу предложить патч с флагом.src/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os (1)
1068-1079: Определение модифицированных полей: корректно и лаконичноХорошее использование Компаратор.Совпадают и кэшированных описаний.
| Процедура ПередСборкой(РабочийКаталог) Экспорт | ||
| ПодготовкаКомпонентов = ЗагрузитьСценарий("build/ПодготовкаКомпонентов.os"); | ||
| ПодготовкаКомпонентов.Подготовить(); | ||
| КонецПроцедуры |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Удалите BOM в начале файла.
Символ BOM () в строке 1 может создавать проблемы в некоторых инструментах. Уберите его.
-Процедура ПередСборкой(РабочийКаталог) Экспорт
+Процедура ПередСборкой(РабочийКаталог) Экспорт📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Процедура ПередСборкой(РабочийКаталог) Экспорт | |
| ПодготовкаКомпонентов = ЗагрузитьСценарий("build/ПодготовкаКомпонентов.os"); | |
| ПодготовкаКомпонентов.Подготовить(); | |
| КонецПроцедуры | |
| Процедура ПередСборкой(РабочийКаталог) Экспорт | |
| ПодготовкаКомпонентов = ЗагрузитьСценарий("build/ПодготовкаКомпонентов.os"); | |
| ПодготовкаКомпонентов.Подготовить(); | |
| КонецПроцедуры |
🤖 Prompt for AI Agents
In packagedef around lines 1 to 4, the file begins with a BOM character ()
which can break some tools; remove the BOM so the file starts with the first
Cyrillic character, re-save the file as UTF-8 without BOM (or strip the U+FEFF
at the very start), and verify there are no other hidden/startup bytes before
"Процедура".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отсутствует импорт collectionos при использовании ФиксированныйМассив
Методы Параметры() и Колонки() создают ФиксированныйМассив, но модуль не импортирует collectionos.
Добавьте импорт:
#Использовать asserts
#Использовать delegate
#Использовать validate
#Использовать reflector
+#Использовать collectionosAlso applies to: 381-383, 721-723
🤖 Prompt for AI Agents
В файле src/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os в строках
1-5 (и аналогично в местах 381-383 и 721-723) отсутствует импорт модуля
collectionos, хотя методы Параметры() и Колонки() создают ФиксированныйМассив;
добавьте в начало файла импорт модуля collectionos (или импортировать конкретно
ФиксированныйМассив из collectionos) и обновите обращения к ФиксированныйМассив
при необходимости, чтобы сборка увидела этот тип.
| Функция ПрочитатьИзJson(ИмяФайла) Экспорт | ||
|
|
||
| _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); | ||
|
|
||
| ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8"); | ||
| Строка = ЧтениеТекста.Прочитать(); | ||
| ЧтениеТекста.Закрыть(); | ||
|
|
||
| Десериализатор = Новый ДесериализаторJsonBench(); | ||
| Настройки = Десериализатор.Десериализовать(Строка, Тип("НастройкиБенчмарковДто")); | ||
|
|
||
| _Лог.Отладка("Завершение чтения файла: %1", ИмяФайла); | ||
|
|
||
| Возврат Настройки; | ||
|
|
||
| КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Чтение настроек из JSON — ok; несоответствие описания возврата
Код возвращает НастройкиБенчмарковДто, а в комментарии указано «БенчмаркиСКонфигурацией». Уточните описание, чтобы не вводить в заблуждение. Также добавьте try/finally для закрытия ЧтениеТекста.
-// Возвращаемое значение:
-// БенчмаркиСКонфигурацией
+// Возвращаемое значение:
+// НастройкиБенчмарковДто-ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8");
-Строка = ЧтениеТекста.Прочитать();
-ЧтениеТекста.Закрыть();
+ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8");
+Попытка
+ Строка = ЧтениеТекста.Прочитать();
+Исключение
+ // _Лог.Ошибка(...) по желанию
+КонецПопытки;
+Если ЗначениеЗаполнено(ЧтениеТекста) Тогда ЧтениеТекста.Закрыть(); КонецЕсли;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Функция ПрочитатьИзJson(ИмяФайла) Экспорт | |
| _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); | |
| ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8"); | |
| Строка = ЧтениеТекста.Прочитать(); | |
| ЧтениеТекста.Закрыть(); | |
| Десериализатор = Новый ДесериализаторJsonBench(); | |
| Настройки = Десериализатор.Десериализовать(Строка, Тип("НастройкиБенчмарковДто")); | |
| _Лог.Отладка("Завершение чтения файла: %1", ИмяФайла); | |
| Возврат Настройки; | |
| КонецФункции | |
| Функция ПрочитатьИзJson(ИмяФайла) Экспорт | |
| _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); | |
| ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8"); | |
| Попытка | |
| Строка = ЧтениеТекста.Прочитать(); | |
| Исключение | |
| // _Лог.Ошибка(...) по желанию | |
| КонецПопытки; | |
| Если ЗначениеЗаполнено(ЧтениеТекста) Тогда ЧтениеТекста.Закрыть(); КонецЕсли; | |
| Десериализатор = Новый ДесериализаторJsonBench(); | |
| Настройки = Десериализатор.Десериализовать(Строка, Тип("НастройкиБенчмарковДто")); | |
| _Лог.Отладка("Завершение чтения файла: %1", ИмяФайла); | |
| Возврат Настройки; | |
| КонецФункции |
| &Аннотация("Сериализуемое") | ||
| Процедура ПриСозданииОбъекта(Значение = "", Обязательное = Ложь) | ||
| КонецПроцедуры |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Параметры аннотации нигде не сохраняются.
Без сохранения значений конструкторских параметров аннотация рискует быть только маркерной, а переименование/«обязательное» не дойдут до сериализатора.
&Аннотация("Сериализуемое")
-Процедура ПриСозданииОбъекта(Значение = "", Обязательное = Ложь)
-КонецПроцедуры
+Перем Значение Экспорт; // имя свойства в JSON
+Перем Обязательное Экспорт; // включать при Неопределено
+
+Процедура ПриСозданииОбъекта(Значение = "", Обязательное = Ложь)
+ ЭтотОбъект.Значение = Значение;
+ ЭтотОбъект.Обязательное = Обязательное;
+КонецПроцедурыПожалуйста, подтвердите, что текущий сериализатор читает параметры именно из полей экземпляра аннотации, а не из метаданных сигнатуры. Если из сигнатуры — покажите тест, и правка не нужна.
I need to investigate the codebase to verify the review comment. Let me search for how the serializer reads annotation parameters.
---
🏁 Script executed:
```shell
#!/bin/bash
# Search for serializer implementation files
fd -t f -e os | head -30
Length of output: 1479
🏁 Script executed:
#!/bin/bash
# Search for files mentioning serializer and annotation parameter reading
rg -n "Значение|Обязательное" -A 3 -B 3 --type-add 'bsl:*.os' --type bslLength of output: 161892
🏁 Script executed:
#!/bin/bash
# Find all annotation-related classes
fd -t f -e os | xargs rg -l "Аннотация" | head -20Length of output: 1485
🏁 Script executed:
#!/bin/bash
# Search for serializer that uses АннотацияСериализуемое
rg -n "АннотацияСериализуемое|Сериализуемое" -A 5 -B 2 --type-add 'bsl:*.os' --type bslLength of output: 18031
🏁 Script executed:
#!/bin/bash
# Look for test files related to serialization
fd -t f \( -name "*Сериализ*" -o -name "*Test*" \) -e osLength of output: 230
Annotation parameters must be stored in instance fields for serializer to read them correctly.
Verification shows the serializer and deserializer extract parameters directly from the annotation instance using ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", ...) and ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Обязательное", ...). With the current empty constructor, these instance fields are never populated, making the annotation essentially a marker without functional parameters.
🤖 Prompt for AI Agents
In src/BenchmarkOneScript/jason/Классы/АннотацияСериализуемое.os around lines
16–18 the constructor ПриСозданииОбъекта does not assign the incoming parameters
to any instance fields so the serializer cannot read them; modify the class to
declare instance fields (e.g. Значение and Обязательное) and inside
ПриСозданииОбъекта assign the incoming values to those fields (apply default
values when parameters are omitted) so that ПолучитьЗначениеПараметраАннотации
can retrieve the stored parameter values correctly.
| Функция ПреобразоватьТип(Объект) | ||
| Возврат Тип(Объект); | ||
| КонецФункции | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Преобразование Типа без защиты от неверного значения
Тип(Объект) выбросит исключение при невалидной строке.
Обёртка с обработкой ошибок упростит диагностику:
Функция ПреобразоватьТип(Объект)
- Возврат Тип(Объект);
+ Попытка
+ Возврат Тип(Объект);
+ Исключение
+ ВызватьИсключение СтрШаблон("Неверное значение типа: %1", Объект);
+ КонецПопытки;
КонецФункции🤖 Prompt for AI Agents
В файле src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os около
строк 99–102 функция ПреобразоватьТип(Объект) просто возвращает Тип(Объект), что
бросает исключение при невалидной строке; оберните вызов Тип(Объект) в блок
обработки ошибок (попробовать/исключение) и в случае ошибки перехватите
исключение, добавив понятное сообщение о входных данных (и при желании исходное
исключение) либо верните безопасное значение/null, чтобы избежать необработанных
исключений и упростить диагностику.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
♻️ Duplicate comments (1)
src/BenchmarkOneScript/core/Модули/Компаратор.os (1)
51-66: Missing explicit key existence check can cause incorrect equality.Unlike
СтруктурыСовпадают(line 76) which properly checksСтруктура2.Свойство(Ключ), this function accessesСоответствие2[Ключ]without verifying the key exists. In OneScript, accessing a non-existent key returnsНеопределено, which can lead to false positives when comparing maps withНеопределеноvalues.Example:
- Соответствие1 =
{A: Неопределено}(count = 1)- Соответствие2 =
{B: Неопределено}(count = 1)- When checking key A: both return
Неопределено, incorrectly matching despite different keys.Consider adding an explicit iteration over keys in both directions or collecting keys for comparison:
Функция СоответствияСовпадают(Соответствие1, Соответствие2) Если Соответствие1.Количество() <> Соответствие2.Количество() Тогда Возврат Ложь; КонецЕсли; Для Каждого КлючЗначение Из Соответствие1 Цикл Ключ = КлючЗначение.Ключ; + // Проверяем существование ключа во втором соответствии + Если Не СоответствиеСодержитКлюч(Соответствие2, Ключ) Тогда + Возврат Ложь; + КонецЕсли; + Если Не Совпадают(Соответствие1[Ключ], Соответствие2[Ключ]) Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции + +// Helper function to check if key exists (since values can be Неопределено) +Функция СоответствиеСодержитКлюч(Соответствие, Ключ) + Для Каждого КлючЗначение Из Соответствие Цикл + Если КлючЗначение.Ключ = Ключ Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь; +КонецФункции
🧹 Nitpick comments (4)
src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os (3)
86-90: Simplify condition for consistency.The double negative
Не Настройки = Неопределеноis less readable thanНастройки <> Неопределено(which you use at line 172).Apply this diff:
- Если Не Настройки = Неопределено И Настройки.ДескрипторыБенчмарков.Количество() > 0 Тогда + Если Настройки <> Неопределено И Настройки.ДескрипторыБенчмарков.Количество() > 0 Тогда
92-100: Consider logging a summary of execution results.Errors are logged per-type, but there's no summary at the end showing which types succeeded or failed. For multiple benchmark types, this could make it harder to identify problems at a glance.
Consider tracking execution results and logging a summary after the loop, e.g.:
УспешныеТипы = Новый Массив(); ПроваленныеТипы = Новый Массив(); Для Каждого Тип Из ПодключенныеТипы Цикл Попытка Бенчмаркинг.Запустить(Источник, КонфигурацияТипа); УспешныеТипы.Добавить(Тип); Исключение _Лог.Ошибка("..."); ПроваленныеТипы.Добавить(Тип); КонецПопытки; КонецЦикла; Если ПроваленныеТипы.Количество() > 0 Тогда _Лог.Предупреждение("Завершено с ошибками. Успешно: %1, Провалено: %2", УспешныеТипы.Количество(), ПроваленныеТипы.Количество()); КонецЕсли;
133-146: Past issue resolved: Self-modification during iteration fixed.The previous review comment about self-modification has been properly addressed. The code now uses a separate
НайденныеФайлыvariable (line 135) to avoid modifyingФайлыduring iteration.However, note that duplicate checking using
Массив.Найти()at lines 137 and 143 results in O(n²) complexity. For typical benchmark use cases, this is acceptable, but if you expect hundreds of files, consider using aСоответствиеfor O(1) lookup.src/BenchmarkOneScript/core/Модули/Компаратор.os (1)
68-87: LGTM! Structure comparison correctly checks key existence.The explicit
Структура2.Свойство(Ключ)check (line 76) properly verifies the key exists before comparing values, which is the correct approach.Minor: Line 80 could use the local
Ключvariable instead ofКлючЗначение.Ключfor consistency:- Если Не Совпадают(Структура1[Ключ], Структура2[КлючЗначение.Ключ]) Тогда + Если Не Совпадают(Структура1[Ключ], Структура2[Ключ]) Тогда
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os(3 hunks)src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os(1 hunks)src/BenchmarkOneScript/core/Модули/ИзвлекательКонфигурацииБенчмарков.os(2 hunks)src/BenchmarkOneScript/core/Модули/Компаратор.os(1 hunks)src/BenchmarkOneScript/dto/Классы/НастройкиБенчмарковДто.os(1 hunks)tests/ТестыСериализаторБенчмарков.os(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os
- tests/ТестыСериализаторБенчмарков.os
- src/BenchmarkOneScript/dto/Классы/НастройкиБенчмарковДто.os
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: sonar / test
- GitHub Check: sonar / test
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (stable) / build (windows-latest, stable)
🔇 Additional comments (10)
src/BenchmarkOneScript/core/Модули/ИзвлекательКонфигурацииБенчмарков.os (4)
2-2: LGTM! Missing import added.The reflector package is used at line 22 (
РефлекторОбъекта), so this import declaration is necessary and fixes a missing dependency.
9-9: LGTM! Documentation clarity improved.Removing the redundant "Тип, " prefix makes the parameter documentation clearer and more concise.
37-43: LGTM! Consistency improved and potential null reference prevented.Using
КонфигурацияБенчмарковinstead ofКонфигурацияensures a valid object is always passed. WhenКонфигурация = Неопределено(line 16), passingКонфигурацияwould result in passingНеопределеноto these functions, causing errors when they invoke methods on the configuration. This change aligns with lines 29-36 which already useКонфигурацияБенчмарков.
51-54: LGTM! Consistency completed for event handlers.Same fix as lines 37-43: using
КонфигурацияБенчмарковensures a valid configuration object is passed toПрочитатьОбработчикиСобытия, preventing potential null reference errors. This completes the consistency improvement across the entireИзвлечьfunction.src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os (3)
47-49: LGTM: Clean migration to settings-based configuration.The rename from
--configto--settingsaligns with the PR objective to introduce JSON-based settings.
65-69: LGTM: Logger initialization is correct.Logger properly declared and initialized for error reporting.
170-176: LGTM: Configuration initialization handles both settings and defaults.The function correctly initializes configuration from
Настройкиwhen provided, or creates a default configuration otherwise. CLI options are then applied to override settings.src/BenchmarkOneScript/core/Модули/Компаратор.os (3)
11-29: LGTM! Well-structured dispatch logic.The type-based dispatch pattern is clean and handles the main collection types appropriately. The early type-mismatch check (line 15) is efficient, and the fallback to simple equality for primitives is correct.
35-49: LGTM! Array comparison is correct.The length check followed by element-wise recursive comparison is the standard approach for deep array equality.
89-114: LGTM! Table comparison is comprehensive.The implementation properly verifies:
- Row and column count equality (lines 91-92)
- Column name matching (lines 96-100)
- Cell-by-cell recursive comparison (lines 102-110)
This ensures both schema and data equality for value tables.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add validation for empty benchmark types.
If ПодключитьТипы() returns an empty array (e.g., no valid benchmark files found), the loop won't execute and the command will exit silently without informing the user. This could lead to confusion.
Consider adding validation:
ПодключенныеТипы = ПодключитьТипы();
+Если ПодключенныеТипы.Количество() = 0 Тогда
+ _Лог.Предупреждение("Не найдено ни одного файла с бенчмарками для запуска");
+ Возврат;
+КонецЕсли;
+
Настройки = ПрочитатьНастройки();📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ПодключенныеТипы = ПодключитьТипы(); | |
| Настройки = ПрочитатьНастройки(); | |
| Конфигурация = ПрочитатьКонфигурацию(Настройки); | |
| Для Каждого ИмяФайла Из ФайлыБенчмарков() Цикл | |
| Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); | |
| Если Не Тип = Неопределено Тогда | |
| Конфигурация = Новый КонфигурацияБенчмарков(Тип); | |
| Конфигурация.Объединить(ПрочитатьКонфигурацию()); | |
| Бенчмаркинг.Запустить(Тип, Конфигурация); | |
| Для Каждого Тип Из ПодключенныеТипы Цикл | |
| ПодключенныеТипы = ПодключитьТипы(); | |
| Если ПодключенныеТипы.Количество() = 0 Тогда | |
| _Лог.Предупреждение("Не найдено ни одного файла с бенчмарками для запуска"); | |
| Возврат; | |
| КонецЕсли; | |
| Настройки = ПрочитатьНастройки(); | |
| Конфигурация = ПрочитатьКонфигурацию(Настройки); | |
| Для Каждого Тип Из ПодключенныеТипы Цикл |
🤖 Prompt for AI Agents
In src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os around lines 77 to 81,
ПодключенныеТипы may be an empty array which causes the subsequent loop to be
skipped and the command to exit silently; add a validation immediately after
ПодключенныеТипы = ПодключитьТипы() that checks if the array is empty, and if so
write a clear error/message to the user (or лог) indicating "No benchmark types
found" and terminate the command early (throw/exit) with a non-zero status so
the failure is visible to callers. Ensure the check handles null/undefined as
well as zero-length arrays and avoids proceeding to
ПрочитатьНастройки/ПрочитатьКонфигурацию when there are no types.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Verify error handling in СериализаторНастроекБенчмарков.
Ensure that СериализаторНастроекБенчмарков.ПрочитатьИзJson() properly handles cases where the file doesn't exist, is unreadable, or contains malformed JSON. If not, the command will fail with an unclear error.
Run this script to verify error handling:
🏁 Script executed:
#!/bin/bash
# Description: Check if СериализаторНастроекБенчмарков handles file errors
ast-grep --pattern $'class СериализаторНастроекБенчмарков {
$$$
ПрочитатьИзJson($$$) {
$$$
}
$$$
}'Length of output: 0
---
🏁 Script executed:
```shell
#!/bin/bash
# Find the СериализаторНастроекБенчмарков file
fd СериализаторНастроекБенчмарков
Length of output: 68
🏁 Script executed:
#!/bin/bash
# Search for the ПрочитатьИзJson method definition
rg -n "ПрочитатьИзJson" --type-add 'os:*.os' --type os -A 10 -B 2Length of output: 7384
🏁 Script executed:
#!/bin/bash
# Search for the СериализаторНастроекБенчмарков class/method structure
rg -n "СериализаторНастроекБенчмарков" --type-add 'os:*.os' --type os -C 5Length of output: 3872
---
🏁 Script executed:
```shell
#!/bin/bash
# Read the full ПрочитатьИзJson method implementation
cat src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os | sed -n '48,65p'
Length of output: 458
🏁 Script executed:
#!/bin/bash
# Check if there are any Попытка (try) blocks in the file to understand error handling patterns
rg -n "Попытка|Исключение" src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.osLength of output: 0
Add error handling to СериализаторНастроекБенчмарков.ПрочитатьИзJson().
The method reads files and deserializes JSON without any error handling. If the file doesn't exist, is unreadable, or contains invalid JSON, it will crash with an unclear error. Wrap file operations in a try/catch block (Попытка/Исключение) or validate file existence before reading.
Affected code: src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os, lines 52–57 (file read and deserialization).
🤖 Prompt for AI Agents
In src/BenchmarkOneScript/core/Классы/СериализаторНастроекБенчмарков.os around
lines 52–57, the code performs file reading and JSON deserialization with no
error handling; wrap the file read + JSON parse in a Попытка/Исключение block
(or first check file existence/читабельность) and on error either return
Неопределено or rethrow a clear Исключение with context (including filename and
error message) so callers (e.g., КомандаЗапуска.os) don't crash with an unclear
error; ensure resources are handled and the function fails gracefully.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion | 🟠 Major
Add error handling for class connection failures.
If Бенчмаркинг.ПодключитьКласс() throws an exception (e.g., syntax error in benchmark file), the entire function fails and no benchmarks will run. Wrapping in a try-catch allows processing to continue for other files.
Apply this diff:
Функция ПодключитьТипы()
ПодключенныеТипы = Новый Массив();
Для Каждого ИмяФайла Из НайтиФайлыБенчмарков() Цикл
- Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла);
- Если Не Тип = Неопределено Тогда
- ПодключенныеТипы.Добавить(Тип);
- КонецЕсли;
+ Попытка
+ Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла);
+ Если Не Тип = Неопределено Тогда
+ ПодключенныеТипы.Добавить(Тип);
+ КонецЕсли;
+ Исключение
+ _Лог.Ошибка("Не удалось подключить класс из файла <%1>: %2",
+ ИмяФайла,
+ ОписаниеОшибки());
+ КонецПопытки;
КонецЦикла;
Возврат ПодключенныеТипы;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Функция ПодключитьТипы() | |
| ПодключенныеТипы = Новый Массив(); | |
| Для Каждого ИмяФайла Из НайтиФайлыБенчмарков() Цикл | |
| Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); | |
| Если Не Тип = Неопределено Тогда | |
| ПодключенныеТипы.Добавить(Тип); | |
| КонецЕсли; | |
| КонецЦикла; | |
| Возврат Каталоги; | |
| Возврат ПодключенныеТипы; | |
| КонецФункции | |
| Функция ПодключитьТипы() | |
| ПодключенныеТипы = Новый Массив(); | |
| Для Каждого ИмяФайла Из НайтиФайлыБенчмарков() Цикл | |
| Попытка | |
| Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); | |
| Если Не Тип = Неопределено Тогда | |
| ПодключенныеТипы.Добавить(Тип); | |
| КонецЕсли; | |
| Исключение | |
| _Лог.Ошибка("Не удалось подключить класс из файла <%1>: %2", | |
| ИмяФайла, | |
| ОписаниеОшибки()); | |
| КонецПопытки; | |
| КонецЦикла; | |
| Возврат ПодключенныеТипы; | |
| КонецФункции |
🤖 Prompt for AI Agents
In src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os around lines 115 to 127,
the loop calling Бенчмаркинг.ПодключитьКласс(ИмяФайла) can throw and abort the
whole function; wrap the per-file call in a try-catch so a thrown exception for
one benchmark does not stop processing others, on catch log or record the error
including ИмяФайла and the exception message, continue the loop, and still
return the ПодключенныеТипы array at the end.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os (1)
44-57: Critical issue confirmed: constructor fails when passed a Type object.The verification shows the bug is real. In
СериализаторРезультатовБенчмарков.osline 330,Типis created from a string:Тип = Тип(ДанныеБенчмарк.Тип);, making it a Type object. This Type object is then passed to the constructor at line 342.The constructor at line 46 correctly accepts both Type and instance objects, but line 54 unconditionally calls
ИзвлечьИменаПараметров(Объект)wheneverОбъектis not Undefined. The procedureИзвлечьИменаПараметров(line 287) createsРефлекторОбъекта(Объект), which requires an instance, not a Type.Fix required: Add type checking before calling
ИзвлечьИменаПараметровto skip this call whenОбъектis a Type:Если Не Объект = Неопределено И ТипЗнч(Объект) <> Тип("Тип") Тогда ИзвлечьИменаПараметров(Объект); КонецЕсли;
♻️ Duplicate comments (1)
src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os (1)
99-101: Преобразование Тип(Строка) без защиты.Ранее уже поднималось. Нужна обертка с внятным сообщением.
Функция ПреобразоватьТип(Объект) - Возврат Тип(Объект); + Попытка + Возврат Тип(Объект); + Исключение + ВызватьИсключение СтрШаблон("Неверное значение типа: %1", Объект); + КонецПопытки; КонецФункции
🧹 Nitpick comments (7)
tests/ТестыКонфигурации.os (2)
748-793: Укрепить проверки: не полагаться на порядок параметров и покрыть новые поля.Сейчас ассерты опираются на индексы Параметры[0]/[1]. Это хрупко при изменении порядка. Рекомендую:
- Искать параметры по Имя или Значение через ПроцессорыКоллекций.
- Дополнительно проверить новые свойства ПараметраБенчмарка (Имя не пусто, ЭтоПараметрМетода = Ложь).
Пример вставки (после проверки длины 2):
+ // Параметры: не полагаться на порядок и проверить новые поля + Парам100 = ПроцессорыКоллекций.ИзКоллекции(Параметры).Первый("П -> П.Значение = 100"); + Ожидаем.Что(Парам100, "Параметр со значением 100").Не_().ЭтоНеопределено(); + Ожидаем.Что(Парам100.Имя, "Имя параметра").Заполнено(); + Ожидаем.Что(Парам100.ЭтоПараметрМетода, "Флаг параметра метода").Равно(Ложь);Это снимет зависимость от порядка и заодно валидирует новую модель.
786-786: Расширить типовую проверку параметра.Помимо ИмеетТип("ПараметрБенчмарка"), имеет смысл проверить заполненность Имя и дефолт Ложь для ЭтоПараметрМетода.
src/BenchmarkOneScript/core/Классы/КоллекцияДескрипторовБенчмарков.os (1)
18-20: Поддержать fluent-интерфейс у Очистить/Прочитать.Файл уже использует fluent; логично возвращать ЭтотОбъект для цепочек.
-Процедура Очистить() Экспорт - _ДескрипторыБенчмарков.Очистить(); -КонецПроцедуры +Функция Очистить() Экспорт + _ДескрипторыБенчмарков.Очистить(); + Возврат ЭтотОбъект; +КонецФункции -Процедура Прочитать(ИсточникБенчмарков) Экспорт - Очистить(); - ИзвлекательДескрипторовБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); -КонецПроцедуры +Функция Прочитать(ИсточникБенчмарков) Экспорт + Очистить(); + ИзвлекательДескрипторовБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); + Возврат ЭтотОбъект; +КонецФункцииAlso applies to: 55-59, 131-139
src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os (2)
175-219: Кэшировать метаданные свойств пользовательских типов.Рефлексия для каждого объекта (ПолучитьТаблицуСвойств и построение карты имен) дорогая. Добавьте кэш по ТипОбъекта.
Эскиз:
-Перем КэшИзвестныхТипов; +Перем КэшИзвестныхТипов; +Перем КэшСвойствТипа; // Соответствие: Тип -> {Свойства, КартаИменПолей} Процедура ПриСозданииОбъекта() ... - КэшИзвестныхТипов = Новый МножествоСоответствие; + КэшИзвестныхТипов = Новый МножествоСоответствие; + КэшСвойствТипа = Новый Соответствие(); Функция ПреобразоватьПользовательскийТип(Объект, ТипОбъекта) - Результат = Новый(ТипОбъекта); - СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(ТипОбъекта, Истина); - СвойстваПоИменамПолей = Новый Соответствие(); + Результат = Новый(ТипОбъекта); + Кэш = КэшСвойствТипа[ТипОбъекта]; + Если Кэш = Неопределено Тогда + СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(ТипОбъекта, Истина); + СвойстваПоИменамПолей = Новый Соответствие(); + Для Каждого Свойство Из СвойстваОбъекта Цикл + АннотацияСериализуемое = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Сериализуемое"); + ИмяСвойства = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", Свойство.Имя); + СвойстваПоИменамПолей.Вставить(ИмяСвойства, Свойство); + КонецЦикла; + Кэш = Новый Структура("Свойства,Карта", СвойстваОбъекта, СвойстваПоИменамПолей); + КэшСвойствТипа.Вставить(ТипОбъекта, Кэш); + КонецЕсли; + СвойстваОбъекта = Кэш.Свойства; + СвойстваПоИменамПолей = Кэш.Карта;
221-263: Не пересоздавать контейнер аннотаций каждый раз.КонтейнерАннотаций статичен. Инициализируйте его один раз в ПриСозданииОбъекта и переиспользуйте.
src/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os (2)
111-149: Constructor logic is functional but somewhat indirect.The constructor establishes defaults by:
- Calling setters (lines 133-140), which mark fields as modified
- Clearing modification flags (line 142)
- Remembering values as defaults (line 143)
This works and ensures defaults pass through setter validation. However, it's indirect: setters are called to set defaults, then their side effect (marking modified) is cleared. A more direct approach would be to initialize fields without triggering modification tracking, but the current pattern is acceptable if it ensures consistency.
1098-1129: Field metadata extraction depends on naming convention.Line 1112 uses
Сред(Свойство.Имя, 2)to derive the public field name by stripping the leading"_". This assumes all internal fields follow the exact pattern_ИмяПоля.If any field is named differently (e.g.,
__Field,Field, or_m_Field), the extraction will produce incorrect names. Document this naming requirement or add validation to detect violations.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (11)
src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os(8 hunks)src/BenchmarkOneScript/core/Классы/КоллекцияДескрипторовБенчмарков.os(3 hunks)src/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os(12 hunks)src/BenchmarkOneScript/core/Классы/ПараметрБенчмарка.os(1 hunks)src/BenchmarkOneScript/core/Классы/ПараметрыМетодаБенчмарка.os(1 hunks)src/BenchmarkOneScript/dto/Классы/НастройкиБенчмарковДто.os(1 hunks)src/BenchmarkOneScript/jason/Классы/АннотацияСериализуемыйКлюч.os(1 hunks)src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os(1 hunks)src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os(1 hunks)tests/ТестыКонфигурации.os(3 hunks)tests/ТестыСериализаторБенчмарков.os(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- src/BenchmarkOneScript/core/Классы/ПараметрыМетодаБенчмарка.os
- tests/ТестыСериализаторБенчмарков.os
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: sonar / test
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: sonar / test
🔇 Additional comments (13)
src/BenchmarkOneScript/jason/Классы/АннотацияСериализуемыйКлюч.os (1)
9-10: No changes required—empty procedure bodies are intentional and consistent across all annotation classes.The codebase uses a marker-based annotation pattern where all similar annotation classes (
АннотацияСериализуемое,АннотацияНесериализуемое) also have emptyПриСозданииОбъектаprocedure bodies, even when parameters are declared. This confirms the annotations work through reflection and metadata presence rather than runtime initialization logic.tests/ТестыКонфигурации.os (1)
14-14: Переименование вызова — ок.Вызов обновлен на ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации — без замечаний.
src/BenchmarkOneScript/core/Классы/КоллекцияДескрипторовБенчмарков.os (1)
3-7: Аннотации сериализации — ок.Схема &Сериализуемое("Items") + &Тип("Массив") + &ДляКаждого &Тип("ДескрипторБенчмарка") выглядит корректно для JSON-массива элементов.
src/BenchmarkOneScript/core/Классы/ПараметрБенчмарка.os (1)
3-11: LGTM: сериализация и значения по умолчанию.Ключи JSON (Name/Value/IsMethodParameter) и дефолты (""/Неопределено/Ложь) заданы корректно и совместимы с отсутствующими полями при десериализации.
Also applies to: 12-18
src/BenchmarkOneScript/dto/Классы/НастройкиБенчмарковДто.os (1)
1-14: LGTM: DTO-контейнер.Поле-дескрипторы и конфигурация инициализируются и помечены для сериализации. Без замечаний.
src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os (2)
138-184: LGTM with note on exception handling.The complex type serialization logic correctly:
- Validates known types and logs warnings for unknown types
- Invokes
ПередСериализациейlifecycle hook when present- Processes
Несериализуемое,Сериализуемое, andОбязательноеannotations- Recursively serializes property values
Note that if
ПередСериализацией(line 154) throws an exception, it will propagate uncaught. If fail-fast behavior is intended, this is correct; otherwise, consider whether lifecycle errors should be wrapped with context.
206-225: LGTM.Constructor correctly initializes reflector, logger, and type caches. Note that
КэшИзвестныхТиповis populated with all known user types at construction time, so dynamically loaded types afterward won't be recognized. This is likely acceptable for the expected usage pattern.src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os (2)
270-279: LGTM.Post-deserialization correctly:
- Validates the deserialized descriptor
- Reconstructs
_ИменаПараметров(markedНесериализуемое) by creating a new instance from_Типand extracting parameter namesThe approach is sound for restoring non-serialized derived state.
96-143: LGTM.Parameter handling correctly refactored to use
ПараметрыМетодаБенчмаркаas a container forПараметрБенчмаркаinstances. The logic maintains backward compatibility for both array and single-value parameter inputs.src/BenchmarkOneScript/core/Классы/КонфигурацияБенчмарков.os (4)
1155-1205: LGTM.Serialization lifecycle correctly:
- Validates that event handlers and parameter sources are serializable (string-typed, not delegates) before serialization
- Converts exporters to type strings for serialization and reconstructs them after deserialization
- Validates configuration integrity after deserialization
The pattern ensures a successful serialization round-trip.
563-620: LGTM.Event handler methods correctly updated to use renamed field
_Обработчики(previously_ОбработчикиСобытий). The public API maintains backward compatibility through theОбработчикиСобытий()getter, while the serialized name is "Обработчики" per line 1360.
975-984: LGTM.Refactored to use metadata-driven approach via
ОписанияПолей()instead of manually constructing rows. This reduces duplication and ensures the field list is maintained in one place through annotations.
1075-1096: Компаратор.Совпадают implementation is comprehensive and correctly handles all configuration field types.The Компаратор module provides dedicated handlers for collection types and recursive comparison for nested structures:
- ТаблицаЗначений receives row-by-row, column-by-column comparison
- Arrays use recursive element comparison
- Соответствие and Структура use recursive key/property value comparison
Field inclusion analysis confirms all tracked fields are properly handled:
- _Параметры (Массив из ПараметрБенчмарка): ✓ covered by array handler
- _Обработчики (ТаблицаЗначений): ✓ covered by dedicated table handler
- _Экспортеры (Массив): ✓ covered by array handler (arbitrary types compared via fallback = operator)
| // Параметры: | ||
| // Значение - Строка - Первый параметр аннотации задаёт имя сериализуемого ключа, | ||
| // а второй - имя ключа в JSON. | ||
| // |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Documentation-signature mismatch: clarify parameter handling.
The documentation describes two separate parameters ("Первый параметр" and "второй"), but the procedure signature accepts only a single parameter Значение. If the annotation accepts two values, clarify whether they're passed as a composite structure or if the documentation should be updated to reflect the actual implementation.
Verify how multiple annotation parameters are handled in OneScript annotations. Run the following script to examine similar annotation patterns in the codebase:
🏁 Script executed:
#!/bin/bash
# Description: Compare parameter handling in related annotation files
# Find and display similar annotation files for pattern comparison
fd -e os "Аннотация.*\.os$" src/BenchmarkOneScript/jason/Классы/ --exec cat {}Length of output: 1408
I need to check how the annotation is used in the codebase to determine whether it should accept one or two parameters.
---
🏁 Script executed:
```shell
#!/bin/bash
# Search for usage of &СериализуемыйКлюч annotation in the codebase
rg "&СериализуемыйКлюч" -C 3
Length of output: 2265
Add missing second parameter to procedure signature.
The annotation is used consistently with TWO parameters throughout the codebase (e.g., &СериализуемыйКлюч("ИмяПоля", "FieldName")), and the documentation correctly describes both: the serializable key name and the JSON key name. However, the procedure signature accepts only one parameter.
Update line 9 to:
Процедура ПриСозданииОбъекта(Значение, ИмяВJSON = "")
This matches the pattern used in АннотацияСериализуемое.os and aligns with the seven usages found in КонфигурацияБенчмарков.os.
🤖 Prompt for AI Agents
In src/BenchmarkOneScript/jason/Классы/АннотацияСериализуемыйКлюч.os around
lines 4–7, the procedure ПриСозданииОбъекта currently accepts only one parameter
but must accept a second parameter for the JSON key; modify the procedure
signature to add a second parameter named ИмяВJSON with a default empty string
(so callers that pass two args continue to work), and update any internal
references to use this new parameter name to match the pattern used in
АннотацияСериализуемое.os and the usages in КонфигурацияБенчмарков.os.
| Функция Десериализовать(Строка, ТипОбъекта = Неопределено, ЧитатьВСоответствие = Ложь) Экспорт | ||
|
|
||
| ЧтениеJSON = Новый ЧтениеJSON(); | ||
| ЧтениеJSON.УстановитьСтроку(Строка); | ||
|
|
||
| ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON, ЧитатьВСоответствие); | ||
| ЧтениеJSON.Закрыть(); | ||
|
|
||
| // Если тип не задан - возвращаем прочитанный объект как есть | ||
| Если ТипОбъекта = Неопределено Тогда | ||
| Возврат ДесериализованныйОбъект; | ||
| КонецЕсли; | ||
|
|
||
| Объект = ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта); | ||
|
|
||
| Возврат Объект; | ||
|
|
||
| КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Закрытие ЧтениеJSON при исключениях — утечка ресурса.
При ошибке парсинга поток не закрывается. Оберните чтение в Попытка/Исключение и гарантируйте Закрыть().
Функция Десериализовать(Строка, ТипОбъекта = Неопределено, ЧитатьВСоответствие = Ложь) Экспорт
-
- ЧтениеJSON = Новый ЧтениеJSON();
- ЧтениеJSON.УстановитьСтроку(Строка);
-
- ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON, ЧитатьВСоответствие);
- ЧтениеJSON.Закрыть();
+ ЧтениеJSON = Новый ЧтениеJSON();
+ Попытка
+ ЧтениеJSON.УстановитьСтроку(Строка);
+ ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON, ЧитатьВСоответствие);
+ Исключение
+ ЧтениеJSON.Закрыть();
+ ВызватьИсключение;
+ КонецПопытки;
+ ЧтениеJSON.Закрыть();📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Функция Десериализовать(Строка, ТипОбъекта = Неопределено, ЧитатьВСоответствие = Ложь) Экспорт | |
| ЧтениеJSON = Новый ЧтениеJSON(); | |
| ЧтениеJSON.УстановитьСтроку(Строка); | |
| ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON, ЧитатьВСоответствие); | |
| ЧтениеJSON.Закрыть(); | |
| // Если тип не задан - возвращаем прочитанный объект как есть | |
| Если ТипОбъекта = Неопределено Тогда | |
| Возврат ДесериализованныйОбъект; | |
| КонецЕсли; | |
| Объект = ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта); | |
| Возврат Объект; | |
| КонецФункции | |
| Функция Десериализовать(Строка, ТипОбъекта = Неопределено, ЧитатьВСоответствие = Ложь) Экспорт | |
| ЧтениеJSON = Новый ЧтениеJSON(); | |
| Попытка | |
| ЧтениеJSON.УстановитьСтроку(Строка); | |
| ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON, ЧитатьВСоответствие); | |
| Исключение | |
| ЧтениеJSON.Закрыть(); | |
| ВызватьИсключение; | |
| КонецПопытки; | |
| ЧтениеJSON.Закрыть(); | |
| // Если тип не задан - возвращаем прочитанный объект как есть | |
| Если ТипОбъекта = Неопределено Тогда | |
| Возврат ДесериализованныйОбъект; | |
| КонецЕсли; | |
| Объект = ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта); | |
| Возврат Объект; | |
| КонецФункции |
🤖 Prompt for AI Agents
В файле src/BenchmarkOneScript/jason/Классы/ДесериализаторJsonBench.os около
строк 42–59 чтение JSON не защищено от исключений: при ошибке парсинга
ЧтениеJSON.Закрыть() не вызывается, что приводит к утечке ресурса; оберните
создание/использование ЧтениеJSON и вызов ПрочитатьJSON в блок Попытка ...
Исключение ... КонецПопытка (или использовать Попытка/Исключение/Всегда в вашей
версии языка), вызовите ЧтениеJSON.Закрыть() в блоке Всегда/Наконец, при
перехвате исключения повторно пробросьте ошибку (или верните соответствующую
ошибку) после закрытия, и сохраните существующую логическую ветвь по
преобразованию и возврату объекта.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: sonar / test
- GitHub Check: sonar / test
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (dev) / build (macos-latest, dev)
🔇 Additional comments (4)
src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os (4)
30-46: LGTM!The main serialization entry point correctly transforms the object and uses the built-in
ЗаписьJSONfor JSON output. The implementation is clean and straightforward.
52-98: LGTM!The dispatcher correctly routes objects to type-specific converters, and the recursive transformation logic for arrays and structures is implemented properly.
166-180: Verify that required fields with Неопределено values should be serialized.Line 178 includes fields marked as
Обязательноеeven when their value isНеопределено. This means required fields will always appear in the JSON output asnulleven if not set. Confirm this behavior aligns with the serialization requirements.
224-224: No issues found — Тип("Null") is valid OScript syntax.In OScript (1C:Enterprise), there are two distinct special "no value" types: NULL (Null) and Неопределено (Undefined), both documented as valid system types. The code at line 224 correctly uses
Тип("Null")as part of the primitive types set for JSON serialization. This is intentional and appropriate—distinguishing between JSON's null value and OScript's undefined state.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.os (1)
745-771: Соответствие: неверная проверка наличия ключа (путает “нет ключа” и “значение = Неопределено”).Сейчас для Соответствие используется сравнение с Неопределено, что срабатывает и при существующем ключе со значением Неопределено. Используйте СодержитКлюч.
Функция ПреобразоватьСтруктуруВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) - ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); + ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); ТипКоллекции = ТипЗнч(Параметры); @@ - Если ТипКоллекции = Тип("Структура") Тогда - ОтсутствуетПараметр = Не Параметры.Свойство(ИмяПараметра); - Иначе - ОтсутствуетПараметр = Параметры[ИмяПараметра] = Неопределено; - КонецЕсли; + Если ТипКоллекции = Тип("Структура") Тогда + ОтсутствуетПараметр = Не Параметры.Свойство(ИмяПараметра); + Иначе // Соответствие + ОтсутствуетПараметр = Не Параметры.СодержитКлюч(ИмяПараметра); + КонецЕсли; @@ - ПараметрБенчмарка = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); + ПараметрБенчмарка = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка);
🧹 Nitpick comments (5)
src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os (3)
89-89: Consider limiting exported transformation functions.Several internal transformation functions are marked
Экспорт:
ПреобразоватьСтруктуру(line 89)ПреобразоватьТаблицуЗначений(line 100)ПреобразоватьПримитивныйТип(line 137)ПреобразоватьТип(line 141)ПреобразоватьКомплексныйТип(line 145)If these are exported for testing or advanced use cases, that's fine. However, if they're purely internal helpers, removing
Экспортwould reduce API surface area and give you more flexibility to refactor internals.Also applies to: 100-100, 137-143, 145-145
193-209: Consider validating annotation parameter structure.Lines 201 and 203 access
Аннотация.Параметры[0].ЗначениеandАннотация.Параметры[1].Значениеafter checking the parameter count. If the annotation framework guarantees that parameters always have aЗначениеproperty, this is fine. Otherwise, accessing.Значениеon a malformed parameter object will throw a runtime error.If annotations can be user-defined or loaded from external sources, consider defensive checks:
Если КоличествоПараметров >= 1 И Аннотация.Параметры[0].Свойство("Значение") Тогда // safe to use Аннотация.Параметры[0].Значение КонецЕсли;
38-46: Consider error handling strategy for production use.The serializer currently uses a fail-fast approach with no try-catch blocks. Any error (reflection failure, property access error, JSON writing error) will propagate as an exception, causing serialization to abort entirely.
This is acceptable for benchmark configuration (fail-fast is good for developer tools), but if this serializer is used for production data pipelines or user-facing features, consider:
- Catching and logging specific errors while continuing serialization where possible
- Providing partial results with error indicators
- Offering a strict vs. lenient mode
Also applies to: 52-72, 145-191
src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.os (2)
241-250: Новый ЗаписатьНастройкиВФайл — лаконично и по месту.Хорошая инкапсуляция. Подумайте об атомарности записи (временный файл + rename) внутри сериализатора, если файл читается внешним процессом конкурентно.
721-739: Массив -> ПараметрыМетодаБенчмарка: хорошо, но синхронизируйте дефолтный пустой набор.Имплементация корректна. Рекомендация: для консистентности типов заменить в ЗапуститьВсеБенчмарки (Линия 336) «Новый Массив()» на «Новый ПараметрыМетодаБенчмарка()», чтобы fallback не смешивал типы.
- КомбинацииПараметров.Добавить(Новый Массив()); + КомбинацииПараметров.Добавить(Новый ПараметрыМетодаБенчмарка());
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.os(9 hunks)src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: sonar / test
- GitHub Check: test (dev) / build (macos-latest, dev)
- GitHub Check: test (dev) / build (windows-latest, dev)
- GitHub Check: test (dev) / build (ubuntu-latest, dev)
- GitHub Check: test (stable) / build (ubuntu-latest, stable)
- GitHub Check: test (stable) / build (macos-latest, stable)
- GitHub Check: test (stable) / build (windows-latest, stable)
- GitHub Check: sonar / test
🔇 Additional comments (7)
src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os (2)
100-135: Past review issues have been addressed.The three issues flagged in previous reviews are now resolved:
- Typo fixed:
СериализоватьВсеКолонкиis correctly spelled (line 108)- Null guard added:
СериализуемыеКлючиdefaults toНеопределеноand is checked at lines 104-106Вставитьcall fixed: line 201 now correctly passes both key and value parametersAlso applies to: 193-209
145-154: Review comment is accurate; flag for developer verification.The code verification confirms:
- The cache (
КэшИзвестныхТипов) is populated once during initialization (lines 218-222) viaРефлектор.ИзвестныеТипы(), making it static, not dynamic.- Unknown types do return
Неопределеноwith a warning (lines 151-154), as stated.- Your concern about types loaded after serializer initialization not being recognized is valid and important—they will not appear in the cache.
- Mandatory properties are always included (line 183), even if
Неопределено, which is by design.The behavior is intentional but warrants conscious acknowledgment. The developer should confirm this static-cache behavior aligns with their use case.
src/BenchmarkOneScript/core/Классы/ЗапускательБенчмарков.os (5)
776-795: СтрокаТаблицыЗначений -> ПараметрыМетодаБенчмарка: корректно.Проверка наличия колонок и формирование параметров выглядят верно.
175-175: Логика с временным файлом настроек — верифицирована и корректна.Сериализатор
СериализаторНастроекБенчмарковсуществует и правильно реализован. МетодыЗаписатьВJson(Дескрипторы, Конфигурация, ИмяФайла)иПрочитатьИзJson(ИмяФайла)корректно сериализуют/десериализуют настройки. Использование на строке 246 показывает, что временный файл правильно передаётся в дочерний процесс, а на строке 111 в КомандаЗапуска.os настройки успешно читаются обратно. Тесты подтверждают совместимость DTO формата.
284-287: No issues found - return structure is correct.Verification confirms that
ПрочитатьИзJsonreturns a Структура containing the expected "Расшифровка" field. The method builds the return structure at lines 320-322, inserting "Расшифровка" as the table of decoding results. The code at ЗапускательБенчмарков.os:287 correctly accesses this field, and the data structure has not changed.
196-199: No backward compatibility concerns;--settingsflag is properly implemented.Verification confirms:
- The
--settingsflag is defined in the CLI parser (КомандаЗапуска.os line 47) and documented in docs/CLI.md- Exhaustive search of all option decorators in КомандаЗапуска.os shows no old
-cor--configflags exist in this codebase- No deprecation layer, compatibility logic, or migration documentation is present
The code change does not require modification. The
--settingsflag is the implemented design with no legacy alternatives to handle.
695-699: Correctly returns collection type with full framework support.Verification confirms all three concerns in the review are properly addressed:
Collection transition verified: Lines 695-699 correctly return
ПараметрыМетодаБенчмаркаas enumerable collection with.Количество()and.Добавить()methods.КомбинаторПараметровБенчмарка support confirmed: Handles the type via explicit check (
Тип("ПараметрыМетодаБенчмарка")at line 38, 45) and properly converts using.ВМассив()method.Parameter output support confirmed:
ВывестиПараметры(lines 963-974) iterates usingДля Каждогоloop, which works becauseПараметрыМетодаБенчмаркаhas the&ДляКаждогоannotation enabling enumeration.The class is fully enumerable and compatible with all consuming code.
| Функция Сериализовать(Объект) Экспорт | ||
| ОбъектСериализации = ПреобразоватьОбъектСериализации(Объект); | ||
|
|
||
| Запись = Новый ЗаписьJSON; | ||
| Запись.УстановитьСтроку(); | ||
| ЗаписатьJSON(Запись, ОбъектСериализации); | ||
|
|
||
| Возврат Запись.Закрыть(); | ||
| КонецФункции | ||
|
|
||
| #КонецОбласти | ||
|
|
||
| #Область СлужебныеПроцедурыИФункции | ||
|
|
||
| Функция ПреобразоватьОбъектСериализации(Объект, СериализуемыеКлючи = Неопределено) | ||
|
|
||
| ТипОбъекта = ТипЗнч(Объект); | ||
|
|
||
| Если ТипОбъекта = Тип("Массив") Тогда | ||
| Результат = ПреобразоватьМассив(Объект); | ||
| ИначеЕсли ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда | ||
| Результат = ПреобразоватьСтруктуру(Объект); | ||
| ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда | ||
| Результат = ПреобразоватьТаблицуЗначений(Объект, СериализуемыеКлючи); | ||
| ИначеЕсли ЭтоПримитивныйТип(ТипОбъекта) Тогда | ||
| Результат = ПреобразоватьПримитивныйТип(Объект); | ||
| ИначеЕсли ТипОбъекта = Тип("Тип") Тогда | ||
| Результат = ПреобразоватьТип(Объект); | ||
| Иначе | ||
| Результат = ПреобразоватьКомплексныйТип(Объект); | ||
| КонецЕсли; | ||
|
|
||
| Возврат Результат; | ||
|
|
||
| КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add circular reference detection to prevent stack overflow.
The serializer recursively transforms objects without tracking visited instances. If an object graph contains cycles (e.g., Object A → Object B → Object A), the recursion will continue indefinitely until a stack overflow occurs.
Consider maintaining a visited-object set (using object identity) and either:
- Throw a descriptive error when a cycle is detected, or
- Replace circular references with a sentinel value (e.g.,
"[Circular]")
Example approach (pseudo-code):
+Перем ОбрабатываемыеОбъекты; // Set to track visited objects during serialization
+
Функция Сериализовать(Объект) Экспорт
+ ОбрабатываемыеОбъекты = Новый МножествоСоответствие();
ОбъектСериализации = ПреобразоватьОбъектСериализации(Объект);
+ ОбрабатываемыеОбъекты = Неопределено;
Запись = Новый ЗаписьJSON;
...
КонецФункции
Функция ПреобразоватьКомплексныйТип(Объект) Экспорт
ТипОбъекта = ТипЗнч(Объект);
+
+ // Check for circular reference
+ Если ОбрабатываемыеОбъекты <> Неопределено И ОбрабатываемыеОбъекты.Содержит(Объект) Тогда
+ ВызватьИсключение "Обнаружена циклическая ссылка при сериализации объекта";
+ КонецЕсли;
+
+ Если ОбрабатываемыеОбъекты <> Неопределено Тогда
+ ОбрабатываемыеОбъекты.Добавить(Объект);
+ КонецЕсли;
ЭтоПользовательскийТип = КэшИзвестныхТипов.Содержит(ТипОбъекта);
...Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In src/BenchmarkOneScript/jason/Классы/СериализаторJsonBench.os around lines
38-72, the recursive serializer lacks circular-reference tracking which can
cause infinite recursion; modify the top-level Сериализовать to initialize a
visited-object set (by identity) and change ПреобразоватьОбъектСериализации
signature to accept this visited set (optional for callers), then on entry check
if the current object is a reference type and already in visited — if so either
throw a descriptive error or return a sentinel like "[Circular]"; otherwise add
the object to visited before recursing into
ПреобразоватьМассив/ПрeобразоватьСтруктуру/ПрeобразоватьТаблицуЗначений/ПрeобразоватьКомплексныйТип
and ensure those functions accept and propagate the same visited set, removing
the object from the set (if you prefer backtracking) when leaving the function.

Summary by CodeRabbit
Documentation
New Features
Bug Fixes
Tests
Chores