Skip to content

Изолированный набор транслирует события родителю по ходу исполнения - #35

Merged
sfaqer merged 3 commits into
masterfrom
fix/isolation-event-streaming
Sep 24, 2026
Merged

sfaqer merged 3 commits into
masterfrom
fix/isolation-event-streaming

Conversation

@sfaqer

@sfaqer sfaqer commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Что было не так

Изолированный набор (особенно на уровне Процесс) отдавал результаты родителю одним куском после завершения своей среды:

  • пока шел дочерний прогон, в дереве была тишина, и время набора выглядело как пауза после предыдущего набора;
  • у вклеенных тестов было время доставки (0-1 мс), а не выполнения - по логу нельзя понять, что тормозит;
  • каждый вклеенный тест помечался в дереве последним (└─);
  • авария дочернего процесса посреди набора теряла результаты всего набора.

Отдельно: консоль CLI рвала дерево пустыми строками на стыках порций вывода дочернего прогона (старый баг, стал заметнее с трансляцией).

Что сделано

Трансляция событий изолированного набора (второй коммит)

  • Изолированная среда транслирует события по ходу исполнения: состав набора на старте, начало и конец каждого теста, конец набора. На уровне Поделка - в памяти, на уровне Процесс - строками stdout с маркером ##oneunit:, которые родитель разбирает по мере чтения (ТрансляторСобытийИзоляции, КаналСобытийИзоляции, РетрансляторСобытийИзоляции).
  • Зеркала строятся по составу до первого теста, поэтому дерево знает последний тест.
  • Время выполнения измеряется в изолированной среде и переносится в результат (РезультатВыполненияТеста.ПеренестиВремяВыполнения), статистика берет его вместо своего замера.
  • Тесты, выполненные до аварии дочернего процесса, сохраняют результаты; прерванный тест ломается, набор ломается с выводом процесса.
  • Канал устойчив к консоли: строка - чистый ASCII (кириллица экранируется), BOM консоли в UTF-8 отбрасывается, сообщения нумеруются - потерянное сообщение ломает набор с явной причиной, а не оставляет его зеленым.
  • Сериализация результатов вынесена в ПереносРезультатов: JSON-отчет и канал пишут записи одним кодом. Чистое обнаружение изолированных наборов строит зеркала тем же ретранслятором. JSON-отчет дочернего прогона для изолированного набора больше не нужен (для изолированного теста остался).

Консоль CLI печатает вывод прогона целыми строками (первый коммит)

  • ЛогДляКомандыМенеджера печатает только целые строки: недописанный хвост ждет следующей порции 1commands и дописывается после завершения прогона.

Требуемая версия OneScript поднята до 2.2.0 (третий коммит)

  • Строка канала пишется с ЭкранированиеСимволовJSON.СимволыВнеASCII, а до 2.2.0 ЗаписьJSON в этом режиме экранировала дважды: обратный слэш каждой юникод-последовательности экранировался повторно, и кириллические имена возвращались из JSON буквальным текстом escape-последовательностей. Исправлено в к #1532: ОткрытьПоток для ЗаписьJSON EvilBeaver/OneScript#1714.
  • packagedef: .ВерсияСреды("2.2.0") (CI «default» берет версию отсюда), release.yml: сборка релиза на 2.2.0.

Проверка

  • Полный прогон локально: 165/165 на autumn 4.3.13 и на autumn 5.0.0.
  • Процессная изоляция из консоли с chcp 65001 - дерево целое (до исправления BOM в UTF-8 консоли события терялись).
  • Новые тесты: перенос времени на обоих уровнях, ├─/└─ в дереве на обоих уровнях, авария дочернего процесса посреди набора, устойчивость строки канала к кодировке и BOM, потеря сообщения канала ломает набор, склейка порций вывода в логе CLI.

Параллельный запуск изолированных наборов, блокировки ресурсов и временные каталоги - отдельно, после релиза.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Новые возможности
    • События изолированных тестовых прогонов теперь отображаются по мере выполнения, а не только после завершения.
    • При аварийном завершении процесса сохраняются результаты уже выполненных тестов.
    • Время выполнения изолированных тестов точнее учитывается в статистике.
  • Исправления
    • Вывод команд корректно собирается из отдельных фрагментов; незавершённые строки допечатываются после окончания прогона.
    • Потеря сообщений в изолированном прогоне обнаруживается, а повреждённые строки канала не нарушают их разбор.

sfaqer and others added 2 commits September 24, 2026 14:46
1commands отдает вывод дочернего прогона порциями, как успел прочитать:
порция обычно заканчивается переводом строки, а может оборвать строку.
Лог команды резал каждую порцию по переводам строк и печатал все части,
поэтому каждый стык порций давал в консоли пустую строку, а оборванная
строка распадалась надвое.

Теперь лог печатает только целые строки: недописанный хвост каждого потока
ждет следующей порции и дописывается командой после завершения прогона.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Раньше изолированный набор отдавал результаты родителю одним куском после
завершения своей среды: пока шел дочерний прогон, в дереве была тишина,
у вклеенных тестов было время доставки (0-1 мс) вместо времени выполнения,
каждый из них помечался в дереве последним (└─), а авария дочернего процесса
теряла результаты всего набора.

Теперь изолированная среда транслирует события исполнения по ходу:
состав набора на старте, начало и конец каждого теста, конец набора.
На уровне "Поделка" сообщения передаются в памяти, на уровне "Процесс" -
строками stdout с маркером, которые родитель разбирает по мере чтения.

- Зеркала строятся по составу до первого теста - дерево знает последний тест.
- Время выполнения измеряется в изолированной среде и переносится в результат.
- Тесты, выполненные до аварии дочернего процесса, сохраняют результаты;
  прерванный тест ломается, набор ломается с выводом процесса.
- Строка канала - чистый ASCII, BOM консоли в UTF-8 отбрасывается, а сообщения
  нумеруются: потерянное сообщение ломает набор, а не оставляет его зеленым.

Сериализация результатов вынесена в ПереносРезультатов: JSON-отчет и канал
событий пишут записи одним кодом. Чистое обнаружение изолированных наборов
строит зеркала тем же ретранслятором.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: b636faff-d4a6-4349-a46f-b980a4837074

📥 Commits

Reviewing files that changed from the base of the PR and between a334928 and 3d4897e.

📒 Files selected for processing (19)
  • src/cli/internal/Классы/ЛогДляКомандыМенеджера.os
  • src/cli/Классы/КомандаОбнаружить.os
  • src/cli/Классы/КомандаТестировать.os
  • src/core/internal/Классы/ИсполнительИзоляции.os
  • src/core/internal/Классы/КаналСобытийИзоляции.os
  • src/core/internal/Классы/ПереносРезультатов.os
  • src/core/internal/Классы/РезультатВыполненияТеста.os
  • src/core/internal/Классы/РепортерJSON.os
  • src/core/internal/Классы/РепортерПланJSON.os
  • src/core/internal/Классы/РепортерСтатистика.os
  • src/core/internal/Классы/РетрансляторСобытийИзоляции.os
  • src/core/internal/Классы/ТрансляторСобытийИзоляции.os
  • src/shared/Классы/ЗапускательТестирования.os
  • tests/fixtures/isolation/ИзолированныйНаборСПаузой.os
  • tests/fixtures/isolation/ИзолированныйПроцессныйНаборСАварией.os
  • tests/fixtures/isolation/ИзолированныйПроцессныйНаборСПаузой.os
  • tests/fixtures/isolation/ИзолированныйПроцессныйНаборСПорчейКанала.os
  • tests/Изоляция.os
  • tests/КонсольноеПриложение.os

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


Walkthrough

Изолированные прогоны теперь передают события и результаты выполнения родительскому прогону по мере работы. Изменения также добавляют перенос времени тестов, обработку порций вывода и проверки для потери сообщений и аварийного завершения дочернего процесса.

Changes

Ретрансляция событий изолированного прогона

Layer / File(s) Summary
Формат результатов и перенос времени
src/core/internal/Классы/ПереносРезультатов.os, src/core/internal/Классы/РезультатВыполненияТеста.os, src/core/internal/Классы/РепортерJSON.os, src/core/internal/Классы/РепортерПланJSON.os, src/core/internal/Классы/РепортерСтатистика.os
Общие функции преобразуют результаты, причины и статусы между объектами выполнения и JSON-записями. Отчёты используют эти функции. Статистика учитывает перенесённое время выполнения.
Канал событий и потоковый вывод
src/core/internal/Классы/ТрансляторСобытийИзоляции.os, src/core/internal/Классы/КаналСобытийИзоляции.os, src/shared/Классы/ЗапускательТестирования.os, src/cli/internal/Классы/ЛогДляКомандыМенеджера.os, src/cli/Классы/КомандаОбнаружить.os, src/cli/Классы/КомандаТестировать.os
Транслятор отправляет нумерованные события через канал JSON. Параметры запуска включают трансляцию событий. Логгер CLI объединяет порции вывода в строки и сбрасывает оставшиеся фрагменты после выполнения команды.
Приём и публикация событий
src/core/internal/Классы/РетрансляторСобытийИзоляции.os
Ретранслятор сопоставляет полученные события зеркалам тестов и публикует их в родительский прогон. При завершении он формирует результат для потери сообщений, отсутствующего результата или незавершённых тестов.
Подключение ретрансляции в исполнителе
src/core/internal/Классы/ИсполнительИзоляции.os
Исполнитель подключает ретранслятор к запуску в поделке или дочернем процессе. Он передаёт ретранслятору вывод и завершает набор по полученным событиям и результатам.
Проверки изоляции и потокового вывода
tests/Изоляция.os, tests/КонсольноеПриложение.os, tests/fixtures/isolation/*
Добавлены проверки переноса времени, разбора канала, потери сообщений, аварийного завершения процесса, отображения дерева тестов и склейки порций вывода.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant Child as Изолированный прогон
  participant Translator as ТрансляторСобытийИзоляции
  participant Channel as КаналСобытийИзоляции
  participant Relay as РетрансляторСобытийИзоляции
  participant Publisher as Публикатор событий
  Child->>Translator: События начала и конца теста
  Translator->>Channel: Нумерованные сообщения с результатами
  Channel->>Relay: Строки JSON через stdout
  Relay->>Publisher: События и результаты тестов
Loading

Merge Risk: ⚪ Minimal · up to 3d489

Isolated test suites now stream their progress to the parent run, and CLI output is reassembled into whole lines. The reviewed code shows no concrete defect that should block merging.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Заголовок точно описывает основное изменение: передача событий изолированного набора родительскому процессу во время исполнения.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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.

Строка канала событий изоляции пишется с ЭкранированиеСимволовJSON.СимволыВнеASCII,
чтобы кодовая страница консоли не искажала имена наборов и тестов. До 2.2.0
ЗаписьJSON в этом режиме экранировала дважды: \u-последовательность, полученная
от Newtonsoft, повторно проходила экранирование обратного слэша, и вместо
"Н" в JSON попадало "\u041d". Прочитанное значение оставалось буквальным
текстом "Н..." - кириллическое имя набора не совпадало с настоящим, и набор
"не обнаруживался" в дочернем прогоне. Исправлено в OneScript 2.2.0
(EvilBeaver/OneScript#1714).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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