# Ruby Language Support
AI Distiller provides comprehensive support for Ruby codebases using the [tree-sitter-ruby](https://github.com/tree-sitter/tree-sitter-ruby) parser, with full support for Ruby's dynamic nature, metaprogramming features, and modern syntax.
## Overview
Ruby support in AI Distiller captures the essential structure of Ruby code including classes, modules, methods, and constants. The distilled output preserves Ruby's object-oriented design and metaprogramming capabilities while optimizing for AI consumption.
## Recent Fixes (2025-06-15)
1. **Missing `def` keyword** (✅ Fixed)
- **Issue**: Methods were displayed without the `def` keyword
- **Fix**: Updated Ruby formatter to include proper method syntax
- **Impact**: Correct Ruby method declarations in output
2. **Python-style colons** (✅ Fixed)
- **Issue**: Classes and modules had Python-style colons after declarations
- **Fix**: Removed colon from class/module formatting
- **Impact**: Idiomatic Ruby syntax
## Supported Ruby Constructs
### Core Language Features
| Construct | Support Level | Notes |
|-----------|--------------|-------|
| **Classes** | ✅ Full | Including nested classes |
| **Modules** | ✅ Full | Including module nesting |
| **Methods** | ✅ Full | Instance, class methods (self.), module methods |
| **Attr Accessors** | ✅ Full | attr_reader, attr_writer, attr_accessor |
| **Constants** | ✅ Full | Class and module constants |
| **Instance Variables** | ✅ Full | @instance_var |
| **Class Variables** | ✅ Full | @@class_var |
| **Singleton Methods** | ✅ Full | def self.method |
| **Private/Protected** | ✅ Full | Visibility modifiers |
| **Include/Extend** | ✅ Full | Module mixins |
| **Alias** | ✅ Full | Method aliasing |
| **Inheritance** | ✅ Full | Class < SuperClass |
| **Blocks** | ⚠️ Partial | Block parameters in method signatures |
| **Metaprogramming** | ⚠️ Partial | define_method, method_missing |
### Visibility Rules
Ruby visibility in AI Distiller:
- **public**: Default visibility (not marked)
- **private**: Methods below `private` keyword
- **protected**: Methods below `protected` keyword
- **module_function**: Module methods that become instance methods
## Key Features
### 1. **Method Visibility**
AI Distiller correctly handles Ruby's visibility modifiers:
```ruby
// Input
class User
def public_method
"public"
end
private
def private_method
"private"
end
protected
def protected_method
"protected"
end
end
```
```
// Output (default - public only)
class User
def public_method
end
```
### 2. **Module Mixins**
Includes and extends are preserved:
```ruby
// Input
module Trackable
def track(event)
# tracking logic
end
end
class Order
include Trackable
extend ActiveModel::Naming
def process
track(:order_processed)
end
end
```
```
// Output
module Trackable
def track(event)
end
class Order
include Trackable
extend ActiveModel::Naming
def process
end
```
### 3. **Class Methods**
Different ways of defining class methods are supported:
```ruby
// Input
class Calculator
def self.add(a, b)
a + b
end
class << self
def multiply(a, b)
a * b
end
end
end
```
```
// Output
class Calculator
def self.add(a, b)
def self.multiply(a, b)
end
```
### 4. **Attr Accessors**
Ruby's attr_* methods are properly displayed:
```ruby
// Input
class Product
attr_reader :id, :name
attr_writer :price
attr_accessor :quantity
def initialize(id, name)
@id = id
@name = name
end
end
```
```
// Output
class Product
attr_reader :id, :name
attr_writer :price
attr_accessor :quantity
def initialize(id, name)
end
```
## Output Format
### Text Format (Recommended for AI)
The text format preserves idiomatic Ruby syntax:
```ruby
// Input file
module Authentication
extend ActiveSupport::Concern
included do
before_action :authenticate_user!
end
def authenticate_user!
redirect_to login_path unless current_user
end
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
private
def set_current_user(user)
@current_user = user
session[:user_id] = user.id
end
end
class ApplicationController < ActionController::Base
include Authentication
protect_from_forgery with: :exception
rescue_from ActiveRecord::RecordNotFound do |e|
render_404
end
private
def render_404
render file: 'public/404.html', status: :not_found
end
end
// Output (default - public only, no implementation)
module Authentication
extend ActiveSupport::Concern
def authenticate_user!
def current_user
end
class ApplicationController < ActionController::Base
include Authentication
end
```
## Known Limitations
1. **Block Syntax**: Complex block parameters may not be fully captured
2. **Metaprogramming**: Dynamic method definitions are not expanded
3. **String Interpolation**: Not parsed within method implementations
4. **Heredocs**: May not be properly formatted
5. **Lambda/Proc**: Type information limited
## Best Practices
### 1. **Use Explicit Visibility**
Group methods by visibility:
```ruby
class Service
# Public interface
def call(params)
validate(params)
process(params)
end
private
# Implementation details
def validate(params)
# ...
end
def process(params)
# ...
end
end
```
### 2. **Module Organization**
Use modules for shared behavior:
```ruby
module Concerns
module Searchable
extend ActiveSupport::Concern
included do
scope :search, ->(query) { where("name LIKE ?", "%#{query}%") }
end
class_methods do
def searchable_fields
%w[name description]
end
end
end
end
```
### 3. **Documentation**
Use YARD-style comments for better AI understanding:
```ruby
# Processes payment for an order
# @param order [Order] the order to process
# @param payment_method [String] the payment method to use
# @return [PaymentResult] the result of the payment
def process_payment(order, payment_method)
# ...
end
```
## Integration Examples
### Direct CLI Usage
```bash
# Extract public API
aid app/ --format text --private=0 --protected=0 --internal=0 > api.txt
# Include all methods
aid app/ --format text --output full.txt
# Rails models only
aid app/models --format text --implementation=0 > models.txt
```
### Rails Projects
```bash
# Controllers API
aid app/controllers --private=0 --protected=0 --internal=0 --implementation=0 > controllers-api.txt
# Models with associations
aid app/models --format text > models.txt
# Service objects
aid app/services --format text --implementation=0 > services.txt
```
## Future Improvements
- Full block syntax support
- Metaprogramming expansion
- Better heredoc handling
- DSL recognition (RSpec, Rails, etc.)
- Refinements support
## Contributing
Ruby support is actively maintained. Key areas for contribution:
- Complex metaprogramming patterns
- DSL parsing (Rails, RSpec, etc.)
- Block and proc handling
- Performance optimizations
See [CONTRIBUTING.md](../../CONTRIBUTING.md) for development setup.
---
Documentation generated for AI Distiller v0.2.0