Skip to content

feat: Добавлен запуск plain .os-файлов с общим отчетом#50

Merged
Stivo182 merged 4 commits intomainfrom
feat/plain-os-shared-report
Mar 24, 2026
Merged

feat: Добавлен запуск plain .os-файлов с общим отчетом#50
Stivo182 merged 4 commits intomainfrom
feat/plain-os-shared-report

Conversation

@Stivo182
Copy link
Owner

@Stivo182 Stivo182 commented Mar 24, 2026

При смешанном запуске plain .os-файлы объединяются в один отчет, а бенчмарки с аннотацией &Бенчмарк публикуются отдельно.

Summary by CodeRabbit

  • New Features

    • Run multiple benchmark/plain algorithm files in one command with optional merging into a single consolidated report.
  • Documentation

    • CLI docs updated with examples and clarified behavior when mixing annotated benchmarks and plain algorithm files.
  • Tests

    • Added extensive tests for multi-file runs, preparation/cleanup, error handling, logging, and merged-report generation.
  • Refactor

    • Result publishing and file-preparation flows reorganized for clearer lifecycle and cleanup.

При смешанном запуске plain .os-файлы объединяются в один отчет, а бенчмарки с аннотацией &Бенчмарк публикуются отдельно.
@coderabbitai
Copy link

coderabbitai bot commented Mar 24, 2026

Warning

Rate limit exceeded

@Stivo182 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 6 minutes and 16 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ab6b54ad-4c7b-4c09-bea4-fdede6715cca

📥 Commits

Reviewing files that changed from the base of the PR and between 3758407 and 1af3a5f.

📒 Files selected for processing (2)
  • .bsl-language-server.json
  • tests/ТестыЗапускателяФайловБенчмарков.os
📝 Walkthrough

Walkthrough

Refactors CLI run flow to delegate file discovery and grouped execution to a new ЗапускательФайловБенчмарков; adds merging of results for plain .os inputs, extracts publishing into a new Публикатор, adjusts reporter/exporter responsibilities, updates report naming, and adds tests and fixtures.

Changes

Cohort / File(s) Summary
Docs
docs/CLI.md, docs/ЗапускБенчмарков.md
Documented behavior and example for running multiple plain .os files producing a consolidated report; clarifies mixing annotated and plain files.
CLI command
src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os
Removed in-file discovery/cleanup and per-benchmark loop; now constructs ЗапускательФайловБенчмарков, simplifies settings parsing and applies debug port once.
File orchestrator (new)
src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os
New module: discovers files/dirs, groups prepared vs plain algorithms, prepares temp files, runs groups, merges results for plain-file groups, ensures cleanup, applies debug port and publishes results.
Runner decoupling
src/BenchmarkOneScript/core/running/Классы/ЗапускательБенчмарков.os
Constructor accepts optional Репортер; Запустить() returns РезультатЗапуска without printing/exporting.
Executor → Publisher
src/BenchmarkOneScript/core/running/Классы/ИсполнительБенчмарков.os, src/BenchmarkOneScript/core/running/Модули/Бенчмаркинг.os
Post-run publishing moved to ПубликаторРезультатаЗапускаБенчмарков; callers create runner with reporter, capture result, and invoke publisher.
Result publisher (new)
src/BenchmarkOneScript/core/reporting/Классы/ПубликаторРезультатаЗапускаБенчмарков.os
New module encapsulating printing and exporter invocation: ПриСозданииОбъекта(Репортер) and Опубликовать(РезультатЗапуска) exported.
Export naming
src/BenchmarkOneScript/core/exporters/Классы/ЭкспортерРезультатовБенчмарков.os
Added ИмяФайлаОтчета() to pick benchmarks-report for mixed types; file paths normalized before writing.
File preparer
src/BenchmarkOneScript/core/running/Классы/ПодготовительФайлаБенчмарка.os
Refactored temp-file generation to use structured algorithm description and added exported СодержитБенчмарки(ПутьКФайлу).
Matching logic
src/BenchmarkOneScript/core/running/Классы/РезультатЗапускаБенчмарков.os
ПодходитВКачествеЭталона now requires both ТипКласса() and method name to match when reference environment provided.
Tests & fixtures
tests/fixtures/АлгоритмБезАннотации2.os, tests/fixtures/АппендерЛога.os, tests/ТестыЗапускателяФайловБенчмарков.os, tests/ТестыПодготовителяФайлаБенчмарка.os
Added fixtures and comprehensive tests for file-runner: discovery, deduplication, prepared vs plain handling, cleanup on error, merged-report generation, and СодержитБенчмарки() verification.

Sequence Diagram(s)

sequenceDiagram
    participant CLI as КомандаЗапуска
    participant FLauncher as ЗапускательФайловБенчмарков
    participant Preparer as ПодготовительФайлаБенчмарка
    participant Launcher as ЗапускательБенчмарков
    participant Publisher as ПубликаторРезультатаЗапускаБенчмарков
    participant Exporter as ЭкспортерРезультатовБенчмарков

    CLI->>FLauncher: Запустить(массив путей, настройки)
    FLauncher->>FLauncher: Обнаружить и сгруппировать файлы

    loop для каждой группы
        FLauncher->>Preparer: СодержитБенчмарки(файл)?
        Preparer-->>FLauncher: boolean

        alt подготовленные файлы
            FLauncher->>Launcher: Новый(Источник, Конфигурация, Репортер)
            FLauncher->>Launcher: Запустить()
        else обычные алгоритмы
            FLauncher->>Preparer: ОписаниеАлгоритмаИзФайла(...)
            Preparer-->>FLauncher: ОписаниеАлгоритма
            FLauncher->>Preparer: СоздатьВременныйФайлБенчмарка(Описание)
            Preparer-->>FLauncher: temp .os
            FLauncher->>Launcher: Запустить()
        end

        Launcher-->>FLauncher: РезультатЗапуска

        alt требуется объединение
            FLauncher->>FLauncher: Объединить дескрипторы и запуски
            FLauncher->>Publisher: Опубликовать(mergedResult)
        else
            FLauncher->>Publisher: Опубликовать(РезультатЗапуска)
        end
    end

    Publisher->>Publisher: ВывестиРезультатЗапуска()
    Publisher->>Exporter: Новый ЭкспортерРезультатовБенчмарков(репортер)
    Publisher->>Exporter: Экспортер.Записать(результат)
    Exporter->>Exporter: ИмяФайлаОтчета(результат)
    FLauncher-->>CLI: Завершено
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • PR #48 — Overlaps on CLI/docs and core runner changes for running multiple plain .os files and merged reporting.
  • PR #17 — Related runner/CLI changes adding directory/multi-file execution patterns and adjustments to КомандаЗапуска.
  • PR #49 — Modifies the same CLI command/startup flow and configuration handling that intersect with КомандаЗапуска refactor.

Poem

🐇 Взмахнула лапкой — файлы в ряд,

Оркестратор свёл их в общий взгляд.
Репортер шепнул, экспорт запел,
Отчёт единый весело зазвенел.
Хоп-хоп, тесты рядом и код бодрят!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the main feature: adding support for running plain .os files with a shared/consolidated report.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/plain-os-shared-report

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a 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

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/exporters/Классы/ЭкспортерРезультатовБенчмарков.os (1)

10-20: ⚠️ Potential issue | 🟠 Major

Очистка артефактов теперь не убирает старые per-benchmark отчеты.

После перехода на benchmarks-report.* вы удаляете только текущую маску. Если в каталоге уже лежит старый АлгоритмБезАннотации-report.json от предыдущего запуска, mixed-run оставит его рядом с новым общим отчетом, и он будет выглядеть как артефакт текущего прогона.

Also applies to: 38-61

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/BenchmarkOneScript/core/exporters/Классы/ЭкспортерРезультатовБенчмарков.os`
around lines 10 - 20, Текущий код формирует МаскаФайлов = СтрШаблон("%1.*",
ИмяФайла) и вызывает ФС.УдалитьФайлы(Каталог, МаскаФайлов), из‑за чего остаются
старые per‑benchmark файлы; исправьте это, расширив логику удаления: после
вычисления ИмяФайла (ИмяФайлаОтчета) удаляйте не только МаскаФайлов, но и
шаблоны для per‑benchmark отчётов (например все "*-report.*" или конкретный
шаблон вида "%1-*-report.*"/"benchmarks-report.*"), т.е. дополните вызовы
ФС.УдалитьФайлы(Каталог, ...) или добавьте цикл по массиву масок и удаляйте
каждую маску (ссылки: ИмяФайлаОтчета, МаскаФайлов, ФС.УдалитьФайлы).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os`:
- Around line 122-155: В каталожной ветке заменить логику добавления найденных
*.os: вместо прямого создания новой группы для каждого Файл.ПолноеИмя, получить
ПолноеИмяФайла = ПолноеИмяФайлаСценария(Файл.ПолноеИмя), пропустить если
ДобавленныеИсходныеФайлы.Содержит(ПолноеИмяФайла), добавить в
ДобавленныеИсходныеФайлы и затем точно так же, как в ветке для одиночного файла,
проверять _ПодготовительФайлаБенчмарка.СодержитБенчмарки(ПолноеИмяФайла) и либо
ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(ПолноеИмяФайла),
Ложь)), либо создать/использовать ГруппаОбычныхАлгоритмов и добавить
подготовленный файл через
_ПодготовительФайлаБенчмарка.Подготовить(ПолноеИмяФайла) в её Файлы; используйте
те же идентификаторы (НайтиФайлы, ДобавленныеИсходныеФайлы, ГруппыФайлов,
ГруппаОбычныхАлгоритмов) чтобы сохранить поведение для plain .os.

In `@tests/ТестыЗапускателяФайловБенчмарков.os`:
- Around line 97-125: В тесте
ТестДолжен_ЗаписатьПредупреждениеЕслиНеНайденыФайлыБенчмарков текущая очистка
логгера выполняется только до проверок и не защищена от падений; оберните
получение сообщений и все последующие проверочные утверждения в блок, который
гарантированно выполняет восстановление логгера (например Использовать
конструкцию Попытка ... Кроме ... КонецПопытки с финальной очисткой или отдельно
Попытка/Исключение/КонецПопытки для действия и затем Всегда/КонецВсегда для
удаления аппендера и восстановления уровня), чтобы методы
Лог.УдалитьСпособВывода и Лог.УстановитьУровень всегда вызывались даже при
падении проверок; используйте Аппендер.ПолучитьСообщения только внутри
защищённого блока перед утверждениями.

---

Outside diff comments:
In
`@src/BenchmarkOneScript/core/exporters/Классы/ЭкспортерРезультатовБенчмарков.os`:
- Around line 10-20: Текущий код формирует МаскаФайлов = СтрШаблон("%1.*",
ИмяФайла) и вызывает ФС.УдалитьФайлы(Каталог, МаскаФайлов), из‑за чего остаются
старые per‑benchmark файлы; исправьте это, расширив логику удаления: после
вычисления ИмяФайла (ИмяФайлаОтчета) удаляйте не только МаскаФайлов, но и
шаблоны для per‑benchmark отчётов (например все "*-report.*" или конкретный
шаблон вида "%1-*-report.*"/"benchmarks-report.*"), т.е. дополните вызовы
ФС.УдалитьФайлы(Каталог, ...) или добавьте цикл по массиву масок и удаляйте
каждую маску (ссылки: ИмяФайлаОтчета, МаскаФайлов, ФС.УдалитьФайлы).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 52cb74d4-2ec7-4330-be82-74e480e79401

📥 Commits

Reviewing files that changed from the base of the PR and between 5f52af4 and 91f32a4.

📒 Files selected for processing (15)
  • docs/CLI.md
  • docs/ЗапускБенчмарков.md
  • src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os
  • src/BenchmarkOneScript/core/exporters/Классы/ЭкспортерРезультатовБенчмарков.os
  • src/BenchmarkOneScript/core/reporting/Классы/ПубликаторРезультатаЗапускаБенчмарков.os
  • src/BenchmarkOneScript/core/running/Классы/ЗапускательБенчмарков.os
  • src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os
  • src/BenchmarkOneScript/core/running/Классы/ИсполнительБенчмарков.os
  • src/BenchmarkOneScript/core/running/Классы/ПодготовительФайлаБенчмарка.os
  • src/BenchmarkOneScript/core/running/Классы/РезультатЗапускаБенчмарков.os
  • src/BenchmarkOneScript/core/running/Модули/Бенчмаркинг.os
  • tests/fixtures/АлгоритмБезАннотации2.os
  • tests/fixtures/АппендерЛога.os
  • tests/ТестыЗапускателяФайловБенчмарков.os
  • tests/ТестыПодготовителяФайлаБенчмарка.os

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os (1)

122-135: ⚠️ Potential issue | 🟠 Major

Файлы из каталогов обходят ветку подготовки plain .os и не попадут в общий отчет.

В ветке каталога (строки 126-134) каждый найденный *.os сразу добавляется как отдельная группа с ОбъединятьРезультаты = Ложь, без проверки СодержитБенчмарки(). При run <каталог> с plain-скриптами они не объединятся в merged-flow.

Также Файл.ПолноеИмя не нормализуется, что может привести к дубликатам при смешанном вводе каталога и явного файла.

Предлагаемое исправление
 			Для Каждого Файл Из НайденныеФайлы Цикл
 
-				Если ДобавленныеИсходныеФайлы.Содержит(Файл.ПолноеИмя) Тогда
+				ПолноеИмяФайла = ФС.НормализоватьПуть(Файл.ПолноеИмя);
+				Если ДобавленныеИсходныеФайлы.Содержит(ПолноеИмяФайла) Тогда
 					Продолжить;
 				КонецЕсли;
 
-				ДобавленныеИсходныеФайлы.Добавить(Файл.ПолноеИмя);
-				ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(Файл.ПолноеИмя), Ложь));
+				ДобавленныеИсходныеФайлы.Добавить(ПолноеИмяФайла);
+
+				Если _ПодготовительФайлаБенчмарка.СодержитБенчмарки(ПолноеИмяФайла) Тогда
+					ГруппыФайлов.Добавить(НоваяГруппаФайловБенчмарков(МассивФайлов(ПолноеИмяФайла), Ложь));
+				Иначе
+					Если ГруппаОбычныхАлгоритмов = Неопределено Тогда
+						ГруппаОбычныхАлгоритмов = НоваяГруппаФайловБенчмарков(Новый Массив(), Истина);
+						ГруппыФайлов.Добавить(ГруппаОбычныхАлгоритмов);
+					КонецЕсли;
+
+					ГруппаОбычныхАлгоритмов.Файлы.Добавить(_ПодготовительФайлаБенчмарка.Подготовить(ПолноеИмяФайла));
+				КонецЕсли;
 		
 			КонецЦикла;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os`
around lines 122 - 135, В ветке обработки каталогов в классе/файле
ЗапускательФайловБенчмарков.os исправьте логику добавления найденных .os: перед
созданием группы вызывайте СодержитБенчмарки(Файл.ПолноеИмя) и только если она
возвращает true создавайте группу как сейчас; для plain-скриптов (когда
СодержитБенчмарки=false) создавайте группу с ОбъединятьРезультаты = Истина (или
используйте ту же семантику, что и для merged-flow) чтобы обеспечить объединение
результатов; и нормализуйте/канонизируйте путь (например, через существующую
утилиту нормализации пути) для Файл.ПолноеИмя перед проверки/добавления в
ДобавленныеИсходныеФайлы, чтобы избежать дубликатов при смешанном вводе.
Используйте идентификаторы НайденныеФайлы, ДобавленныеИсходныеФайлы,
ГруппыФайлов и НоваяГруппаФайловБенчмарков для локализации изменений.
🧹 Nitpick comments (1)
tests/ТестыЗапускателяФайловБенчмарков.os (1)

237-268: Мутация входного массива.

Строка 246 добавляет элемент в переданный МассивФайлов, что является побочным эффектом. Хотя в текущих вызовах это не вызывает проблем (массивы создаются заново через МассивФайлов()), рекомендуется работать с копией для предсказуемости.

Предлагаемое исправление
 Функция ВыполнитьСЗахватомЛогаПодготовителя(МассивФайлов)
 
 	Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ПодготовительФайлаБенчмарка");
 	ПредыдущийУровень = Лог.Уровень();
 	Аппендер = ЗагрузитьСценарий(ПолныйПутьКФайлу("./tests/fixtures/АппендерЛога.os"));
 
 	Лог.УстановитьУровень(УровниЛога.Отладка);
 	Лог.ДобавитьСпособВывода(Аппендер, УровниЛога.Отладка);
 
-	МассивФайлов.Добавить("ФайлКоторогоНеСуществуетДляТестаЗапускателя.os");
+	ЛокальныйМассив = Новый Массив();
+	Для Каждого Путь Из МассивФайлов Цикл
+		ЛокальныйМассив.Добавить(Путь);
+	КонецЦикла;
+	ЛокальныйМассив.Добавить("ФайлКоторогоНеСуществуетДляТестаЗапускателя.os");
 
 	Попытка
-		Запускатель = Новый ЗапускательФайловБенчмарков(МассивФайлов);
+		Запускатель = Новый ЗапускательФайловБенчмарков(ЛокальныйМассив);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/ТестыЗапускателяФайловБенчмарков.os` around lines 237 - 268, Функция
ВыполнитьСЗахватомЛогаПодготовителя мутирует входной параметр: строка, где
выполняется
МассивФайлов.Добавить("ФайлКоторогоНеСуществуетДляТестаЗапускателя.os"), вносит
побочный эффект; вместо этого создайте локальную копию входного массива
(например, ЛокальныйМассив = Новый Массив(МассивФайлов) или вручную скопируйте
элементы в новый Массив) и добавляйте тестовый элемент в эту копию, затем
передавайте копию в конструктор Новый ЗапускательФайловБенчмарков; оставьте
входной МассивФайлов неизменным.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os`:
- Around line 122-135: В ветке обработки каталогов в классе/файле
ЗапускательФайловБенчмарков.os исправьте логику добавления найденных .os: перед
созданием группы вызывайте СодержитБенчмарки(Файл.ПолноеИмя) и только если она
возвращает true создавайте группу как сейчас; для plain-скриптов (когда
СодержитБенчмарки=false) создавайте группу с ОбъединятьРезультаты = Истина (или
используйте ту же семантику, что и для merged-flow) чтобы обеспечить объединение
результатов; и нормализуйте/канонизируйте путь (например, через существующую
утилиту нормализации пути) для Файл.ПолноеИмя перед проверки/добавления в
ДобавленныеИсходныеФайлы, чтобы избежать дубликатов при смешанном вводе.
Используйте идентификаторы НайденныеФайлы, ДобавленныеИсходныеФайлы,
ГруппыФайлов и НоваяГруппаФайловБенчмарков для локализации изменений.

---

Nitpick comments:
In `@tests/ТестыЗапускателяФайловБенчмарков.os`:
- Around line 237-268: Функция ВыполнитьСЗахватомЛогаПодготовителя мутирует
входной параметр: строка, где выполняется
МассивФайлов.Добавить("ФайлКоторогоНеСуществуетДляТестаЗапускателя.os"), вносит
побочный эффект; вместо этого создайте локальную копию входного массива
(например, ЛокальныйМассив = Новый Массив(МассивФайлов) или вручную скопируйте
элементы в новый Массив) и добавляйте тестовый элемент в эту копию, затем
передавайте копию в конструктор Новый ЗапускательФайловБенчмарков; оставьте
входной МассивФайлов неизменным.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: be3991e8-eae8-4364-9e1d-6abaf20532ab

📥 Commits

Reviewing files that changed from the base of the PR and between 91f32a4 and 128ed67.

📒 Files selected for processing (4)
  • src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os
  • src/BenchmarkOneScript/core/exporters/Классы/ЭкспортерРезультатовБенчмарков.os
  • src/BenchmarkOneScript/core/running/Классы/ЗапускательФайловБенчмарков.os
  • tests/ТестыЗапускателяФайловБенчмарков.os
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/BenchmarkOneScript/core/exporters/Классы/ЭкспортерРезультатовБенчмарков.os
  • src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os

@Stivo182 Stivo182 merged commit 9b753b5 into main Mar 24, 2026
25 of 27 checks passed
@Stivo182 Stivo182 deleted the feat/plain-os-shared-report branch March 24, 2026 20:43
@sonar-openbsl-ru-qa-bot
Copy link

Failed Quality Gate failed

  • 1 New Issues (is greater than 0)

Project ID: benchmark

View in SonarQube

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant