feat: параметр Родитель в @ПодкомандаПриложения для гибкой регистрации подкоманд#19
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (12)
✅ Files skipped from review due to trivial changes (4)
🚧 Files skipped from review as they are similar to previous changes (8)
WalkthroughПеренесена регистрация подкоманд с параметра Changes
Sequence Diagram(s)sequenceDiagram
participant Client as Клиент приложения
participant Decorator as ИКС_ДекораторКоманд
participant Annotation as ИКС_АннотацияПодкомнада
participant Registry as Реестр_Определений
Client->>Decorator: СоздатьКомандуПоАннотациямОбъекта(ДанныеЖелудя)
activate Decorator
Decorator->>Annotation: ПриСозданииОбъекта(..., Родитель="КомандаДата")
activate Annotation
Annotation->>Annotation: Сохранить _Родитель
Annotation->>Decorator: УстановитьЗначениеПараметраАннотации("Родитель", _Родитель)
deactivate Annotation
Decorator->>Decorator: ПолучитьПодкоманды(ДанныеВладельца)
activate Decorator
Decorator->>Registry: Сканировать все КомандаПриложения
Registry->>Registry: Чтение ПодкомандаПриложения.Родитель
Registry->>Registry: Сопоставление с ДанныеВладельца.Имя
rect rgba(100,150,200,0.5)
Registry->>Registry: Дедупликация через ДобавленныеИмена
end
Registry-->>Decorator: Возврат списка подкоманд
deactivate Decorator
Decorator-->>Client: Готовая команда с подкомандами
deactivate Decorator
sequenceDiagram
participant CLI as CLI (Пользователь)
participant Parent as КомандаГруппа
participant Intermediate as ПодкомандаПромежуточная
participant Deep as ПодкомандаВложенная
CLI->>Parent: myapp group
activate Parent
Parent->>Parent: ОбработатьКоманду()
deactivate Parent
CLI->>Parent: myapp group nested
activate Intermediate
Intermediate->>Intermediate: ОбработатьКоманду()
deactivate Intermediate
CLI->>Parent: myapp group nested deep ARG=7
activate Deep
Deep->>Deep: ПриСозданииОбъекта(ARG=7)
Deep->>Deep: СформироватьРезультат() -> 7 * 100 = 700
Deep-->>CLI: Результат = 700
deactivate Deep
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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.
Actionable comments posted: 2
🧹 Nitpick comments (1)
tests/alltests.os (1)
550-624: Добавьте регрессию на смешанный режим регистрации.Сейчас покрыты только happy-path сценарии через
Родитель. По контракту PR ещё поддерживается комбинацияПодкоманда+Родительс дедупликацией по имени бина, и без отдельного теста этот путь легко сломать незаметно.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tests/alltests.os` around lines 550 - 624, Добавьте регрессионный тест, проверяющий смешанный режим регистрации (комбинация "Подкоманда" + "Родитель" с дедупликацией по имени бина): создайте новую процедура (например Подкоманды_ЧерезРодитель_СмешанныйРежим) которая использует ПолучитьПоделку(), Поделка.ЗапуститьПриложение(), затем получает соответствующие объекты через Поделка.НайтиЖелудь("...") и КонсольноеПриложение, формирует параметры, которые запускают путь где субкоманда и родитель зарегистрированы одновременно (убедитесь, что имя бина совпадает для проверки дедупликации), вызывает КонсольноеПриложение.Запустить(ПараметрыКоманды) и добавляет Ожидаем.Что(...).Равно(...) ассерты, проверяющие что результат соответствует ожиданию и что обработка не задублировалась; поместите тест рядом с существующими процедурам Подкоманды_ЧерезРодитель_ПерваяПодкоманда / ВтораяПодкоманда / ВложенностьУровня3.
🤖 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/Классы/ИКС_ДекораторКоманд.os`:
- Line 69: Добавьте защиту от циклических родителей при рекурсивном построении
команд: в функциях, которые вызывают ПолучитьОписаниеПодкоманды(ДанныеКоманды) и
СоздатьКомандуПоАннотациямОбъекта(), заведите структуру отслеживания посещённых
объектов (например, Set по уникальному идентификатору класса/конфигурации) и
проверяйте перед рекурсивным вызовом — если узел уже посещён, пропускайте
дальнейшую рекурсию или выбрасывайте понятную ошибку валидации; гарантируйте,
что та же проверка применяется и для вложенных ветвей, где сейчас повторно
вызывается СоздатьКомандуПоАннотациямОбъекта(), чтобы предотвратить бесконечную
инициализацию в циклических графах.
- Around line 61-68: Замените чтение параметра "Родитель" так, чтобы значение
бралось из аннотации ПодкомандаПриложения, а не из КомандаПриложения: вместо
вызова РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды,
"Родитель", "") вызывайте
РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияПодкоманды,
"Родитель", ""), оставив остальную логику сравнения с ИмяРодителя и проверки
ЗначениеЗаполнено без изменений; используйте существующие переменные
АннотацияПодкоманды, АннотацияКоманды, Родитель, КонструкторКоманды и
РаботаСАннотациями для локализации правки.
---
Nitpick comments:
In `@tests/alltests.os`:
- Around line 550-624: Добавьте регрессионный тест, проверяющий смешанный режим
регистрации (комбинация "Подкоманда" + "Родитель" с дедупликацией по имени
бина): создайте новую процедура (например
Подкоманды_ЧерезРодитель_СмешанныйРежим) которая использует ПолучитьПоделку(),
Поделка.ЗапуститьПриложение(), затем получает соответствующие объекты через
Поделка.НайтиЖелудь("...") и КонсольноеПриложение, формирует параметры, которые
запускают путь где субкоманда и родитель зарегистрированы одновременно
(убедитесь, что имя бина совпадает для проверки дедупликации), вызывает
КонсольноеПриложение.Запустить(ПараметрыКоманды) и добавляет
Ожидаем.Что(...).Равно(...) ассерты, проверяющие что результат соответствует
ожиданию и что обработка не задублировалась; поместите тест рядом с
существующими процедурам Подкоманды_ЧерезРодитель_ПерваяПодкоманда /
ВтораяПодкоманда / ВложенностьУровня3.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: b9b3a21b-b755-4706-922a-e6af45e53c0d
📒 Files selected for processing (12)
docs/product/index.mdexample/Классы/КомандаДата.osexample/Классы/ПодкомандаДень.osexample/Классы/ПодкомандаМесяц.ossrc/Классы/ИКС_АннотацияПодкомнада.ossrc/Классы/ИКС_ДекораторКоманд.ostests/alltests.ostests/Классы/КомандаГруппа.ostests/Классы/ПодкомандаВложенная.ostests/Классы/ПодкомандаПромежуточная.ostests/Классы/ПодкомандаСРодителемВторая.ostests/Классы/ПодкомандаСРодителемПервая.os
| АннотацияПодкоманды = РаботаСАннотациями.НайтиАннотацию(КонструкторКоманды.Аннотации, "ПодкомандаПриложения"); | ||
| Если АннотацияПодкоманды = Неопределено Тогда | ||
| Продолжить; | ||
| КонецЕсли; | ||
|
|
||
| АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(КонструкторКоманды.Аннотации, "КомандаПриложения"); | ||
| Родитель = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Родитель", ""); | ||
| Если ЗначениеЗаполнено(Родитель) И Родитель = ИмяРодителя Тогда |
There was a problem hiding this comment.
Считывайте Родитель из ПодкомандаПриложения.
Line 67 берёт параметр из аннотации КомандаПриложения, хотя в новой схеме он задаётся на ПодкомандаПриложения. В таком виде поиск детей зависит от неявного дублирования аннотаций и может перестать находить подкоманды после любого расхождения между ними.
Предлагаемое исправление
АннотацияПодкоманды = РаботаСАннотациями.НайтиАннотацию(КонструкторКоманды.Аннотации, "ПодкомандаПриложения");
Если АннотацияПодкоманды = Неопределено Тогда
Продолжить;
КонецЕсли;
- АннотацияКоманды = РаботаСАннотациями.НайтиАннотацию(КонструкторКоманды.Аннотации, "КомандаПриложения");
- Родитель = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды, "Родитель", "");
+ Родитель = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияПодкоманды, "Родитель", "");
Если ЗначениеЗаполнено(Родитель) И Родитель = ИмяРодителя Тогда
Результат.Добавить(ПолучитьОписаниеПодкоманды(ДанныеКоманды));
КонецЕсли;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/Классы/ИКС_ДекораторКоманд.os` around lines 61 - 68, Замените чтение
параметра "Родитель" так, чтобы значение бралось из аннотации
ПодкомандаПриложения, а не из КомандаПриложения: вместо вызова
РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияКоманды,
"Родитель", "") вызывайте
РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияПодкоманды,
"Родитель", ""), оставив остальную логику сравнения с ИмяРодителя и проверки
ЗначениеЗаполнено без изменений; используйте существующие переменные
АннотацияПодкоманды, АннотацияКоманды, Родитель, КонструкторКоманды и
РаботаСАннотациями для локализации правки.
…и подкоманд - Добавлен параметр Родитель в аннотацию @ПодкомандаПриложения - Подкоманда сама указывает родительскую команду вместо перечисления в родителе - Поддержка вложенности подкоманд любой глубины - Обратная совместимость: параметр Подкоманда в родителе по-прежнему работает - Обновлены документация, пример и тесты
b830781 to
61a11c1
Compare
Параметр
Родительв@ПодкомандаПриложенияПроблема
Сейчас связь «родитель → подкоманды» объявляется перечислением в родительской команде:
Это приводит к:
Решение
Подкоманда сама указывает своего родителя через новый параметр
Родитель:Родительв одной строкеОбратная совместимость
Старый способ через
Подкоманда = \"...\"в родителе полностью сохранён. Оба способа можно комбинировать, дедупликация по имени бина.Изменения
ИКС_АннотацияПодкомнада.os— добавлен параметрРодительИКС_ДекораторКоманд.os—ПолучитьПодкоманды()собирает детей из обоих источниковdocs/product/index.md— документация обновленаexample/— пример переведён наРодительРодитель(уровень 2) и вложенные подкоманды (уровень 3)Все 24 теста проходят ✅"