ruby-idioms

SkillAI & models

Ruby rewards expressiveness, convention, and developer happiness. Modern Ruby (3.x) favors pattern matching, Ractor for concurrency, and strict typing via Sorbet/RBS. Idiomatic Ruby = readable, tested, convention-following.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the ruby-idioms skill

About this capability

Comprehensive sets of standards and practices designed to elevate the capabilities of AI coding agents.

What this skill tells your AI

The instructions your AI receives, as published by irahardianto/awesome-agv in .agents/skills/ruby-idioms/SKILL.md and read by ahel’s review.

Ruby Idioms and Patterns

Ruby rewards expressiveness, convention, and developer happiness. Modern Ruby (3.x) favors pattern matching, Ractor for concurrency, and strict typing via Sorbet/RBS. Idiomatic Ruby = readable, tested, convention-following.

Scope: Ruby coding idioms. Test naming: .agents/rules/testing-strategy.md. Logging: @.agents/skills/logging-implementation/SKILL.md.

Modern Ruby Features (3.x)

  1. Pattern matching:

    case result
    in { status: :success, data: Task => task }
      render json: task
    in { status: :not_found, id: String => id }
      render json: { error: "Task #{id} not found" }, status: :not_found
    end
    
  2. Endless methods for simple accessors:

    def full_name = "#{first_name} #{last_name}"
    
  3. Data class (3.2+) for immutable value objects:

    TaskResult = Data.define(:task, :status)
    result = TaskResult.new(task: task, status: :created)
    

Error Handling

  1. Domain exception hierarchies:

    class DomainError < StandardError; end
    
    class NotFoundError < DomainError
      attr_reader :resource, :resource_id
      def initialize(resource, resource_id)
        @resource = resource
        @resource_id = resource_id
        super("#{resource} '#{resource_id}' not found")
      end
    end
    
  2. rescue specific exceptions — never bare rescue.

  3. Use ensure for cleanup — equivalent to finally.

Naming

  1. snake_case for methods, variables, file names.
  2. PascalCase for classes, modules.
  3. UPPER_SNAKE_CASE for constants.
  4. ? suffix for boolean queries: active?, valid?.
  5. ! suffix for destructive or dangerous methods: save!, delete!.

Testing

  1. RSpec (preferred) or Minitest:

    RSpec.describe TaskService do
      describe '#create' do
        it 'creates a task with valid attributes' do
          task = service.create(title: 'Test', priority: :high)
          expect(task.title).to eq('Test')
        end
    
        it 'raises ValidationError for blank title' do
          expect { service.create(title: '', priority: :high) }
            .to raise_error(ValidationError)
        end
      end
    end
    
  2. let for lazy setup, before for eager setup.

  3. Factory Bot for test data — never fixtures for complex models.

Formatting and Static Analysis

ToolPurposeCommand
RuboCopFormatting + lintingrubocop --autocorrect
SorbetType checkingsrb tc
BrakemanSecurity scanningbrakeman --no-pager
bundle auditCVE scanningbundle audit check --update

Related

  • Code Idioms and Conventions .agents/rules/code-idioms-and-conventions.md
  • Testing Strategy .agents/rules/testing-strategy.md
  • Error Handling Principles .agents/rules/error-handling-principles.md

Signals

GitHub stars
156
Forks
53
Last commit
Aug 2026
Advanced
Catalog kind
skill
Gateway key
ruby-idioms
Source
github.com/irahardianto/awesome-agv