# Ruby в Maguyva: графы кода для Rails и приложений на Ruby

Canonical source: https://maguyva.ai/ru/languages/ruby

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva поддерживает Ruby с AST, символами и графом, чтобы ИИ-агенты отслеживали классы, модули, синглтон-методы и конструкторы в кодовых базах Rails и Ruby.

## Сводка поддержки

- Уровень: Поддержка AST и символов
- Программирование
- Расширения: .gemfile, .gemspec, .rake, .rakefile, .rb, .rbw
- Настоящий AST-разбор для синтаксически осведомлённого поиска и структурного контекста.
- Именованные символы обеспечивают семантический поиск и перекрёстные ссылки. Навигация по графу доступна, когда включено извлечение связей.
- Этот язык добавляет символы и связи в поиск с учётом графа; поддерживаемые типы рёбер зависят от присущих ему конструкций.
- Доступны и AST-разбор, и извлечение символов.

## Лучше всего подходит

- Монолиты на Rails, где модели, сервис-объекты, задания и concerns вызывают друг друга из множества каталогов.
- Гемы и сервисы на Ruby с глубокими пространствами имён модулей и общими базовыми классами.
- Команды, которые хотят очертить изменение с помощью ИИ-агента, прежде чем трогать модель или сервис, от которых зависит половина приложения.

## Сценарии работы агента

- Найти всех, кто вызывает сервис-объект или метод модели, прежде чем менять их поведение.
- Проследить, где класс создаётся через `.new` и какие методы выполняются дальше.
- Перед рефакторингом составить карту классов, наследующих от базового класса или подключающих модуль.

## Почему репозитории на Ruby трудны для поверхностных ИИ-инструментов

Ruby во многом опирается на соглашения и метапрограммирование. Методы генерируются через `attr_accessor`, классы переоткрываются в других файлах, а пространства имён вкладывают модули на несколько уровней. Читаемая поверхность скрывает, до какого метода на самом деле доходит вызов, а грубый текстовый поиск возвращает каждый `call` и `perform` в приложении.

Maguyva даёт агенту классы, модули, методы и их вызывающих в виде структуры, чтобы он прослеживал изменение по всему приложению, а не гадал.

## Что Maguyva извлекает из Ruby

Maguyva охватывает файлы `.rb`, `.rbw`, `.rake` и `.gemspec`, а также `Gemfile` и `Rakefile`. Извлекаются методы экземпляра и синглтон-методы (`def self.call`), причём синглтон-методы помечаются как статические. Объявления `attr_reader`, `attr_writer` и `attr_accessor` считаются методами доступа, а символы квалифицируются пространством имён модуля и класса.

`ClassName.new` и `Namespace::ClassName.new` считаются созданием экземпляров, а типизация получателей отслеживает локальные присваивания и `@instance_variables`, так что вызов на присвоенном объекте можно разрешить в его класс. Граф также фиксирует наследование, подключение модулей, переопределения, рёбра `raise` и `rescue`, а также чтения и записи.

Вызовы метапрограммирования (`define_method`, `send`, `method_missing`, `class_eval` и подобные), типовые помощники `T::` из Sorbet и распространённые вызовы Enumerable (`each`, `collect`, `reject` и подобные) отфильтровываются из связей, чтобы код приложения был на виду.

## Примеры промптов для агентов

- «Кто вызывает `Billing::ChargeCustomer.call` и из каких заданий и контроллеров?» (`find_symbol`, затем `dependency_search` incoming)
- «Какие модели наследуют от `ApplicationRecord` и подключают `Auditable`?» (`dependency_search`)
- «Проследи, что происходит после того, как заказ помечен как оплаченный.» (`get_task_context`)

## Известные ограничения

- В Ruby `require` и `load` — обычные вызовы методов, поэтому пресет `imports` в `structural_search` ничего не выбирает. Чтобы перечислить их, используйте `text_pattern_search`.
- Методы, созданные во время выполнения через `define_method` или обрабатываемые `method_missing`, не извлекаются как символы, а такие вызовы отфильтровываются как шум метапрограммирования.
- В Ruby нет синтаксиса декораторов, поэтому связи декораторов помечены как неприменимые.

## Следующие шаги

Подключите репозиторий по [быстрому старту](/ru/docs/quickstart), затем изучите матрицу поддержки на [странице совместимости](/ru/docs/compatibility). Для других репозиториев на динамических языках сравните с [руководством по языку Python](/ru/languages/python).

## Детали движка

- Поддержка Ruby охватывает `.rb`, `.rbw`, `.rake`, `.gemspec`, `Gemfile` и `Rakefile`. Синглтон-методы помечаются как статические, а объявления `attr_*` считаются методами доступа.
- `ClassName.new` считается созданием экземпляра, а типизация получателей отслеживает локальные присваивания и переменные экземпляра.
- Вызовы метапрограммирования, такие как `define_method` и `send`, помощники `T::` из Sorbet и распространённые вызовы Enumerable отфильтровываются из связей.

## Полезные точки входа MCP

- `find_symbol`: Используйте для класса, модуля или метода с пространством имён, например `Billing::ChargeCustomer.call`.
- `dependency_search`: Перед изменением используйте обход incoming для модели или сервис-объекта, чтобы увидеть вызывающих и подклассы.
- `text_pattern_search`: Используйте для путей `require`, строк маршрутов и динамически определённых методов, которых граф не видит.
