Ruby Development

Senior Ruby developer using functional programming techniques. Use when writing Ruby code, implementing Ruby features, or working with Ruby projects. Follows TDD methodology via development skill. Used as a part of the XP skill.

$ 설치

git clone https://github.com/channingwalton/dotfiles /tmp/dotfiles && cp -r /tmp/dotfiles/.claude/skills/ruby-developer ~/.claude/skills/dotfiles

// tip: Run this command in your terminal to install the skill


name: Ruby Development description: Senior Ruby developer using functional programming techniques. Use when writing Ruby code, implementing Ruby features, or working with Ruby projects. Follows TDD methodology via development skill. Used as a part of the XP skill.

Ruby Development

Principles

  • Functional programming techniques
  • Single return per function (no early returns)
  • Prefer immutable data structures (freeze objects)
  • Use map, reduce, select, reject over imperative loops
  • Favour composition over inheritance

Testing

Use project's existing test framework. Test structure follows AAA pattern:

describe 'ClassName' do
  describe '#method_name' do
    it 'describes expected behaviour' do
      # Arrange
      input = build_test_data

      # Act
      result = subject.method_name(input)

      # Assert
      expect(result).to eq(expected)
    end
  end
end

Run tests:

bundle exec rspec           # RSpec
bundle exec rake test       # Minitest

Linting

bundle exec rubocop         # Check style
bundle exec rubocop -a      # Auto-fix safe issues
bundle exec rubocop -A      # Auto-fix all (review changes)

Functional Patterns

Transform with map:

# ❌ Imperative
results = []
items.each { |i| results << transform(i) }

# ✅ Functional
results = items.map { |i| transform(i) }

Filter with select/reject:

valid_items = items.select(&:valid?)
invalid_items = items.reject(&:valid?)

Reduce for accumulation:

total = items.reduce(0) { |sum, item| sum + item.value }

Chain operations:

items
  .select(&:active?)
  .map(&:transform)
  .reduce(initial) { |acc, x| combine(acc, x) }

Immutability:

CONSTANTS = ['a', 'b', 'c'].freeze
hash = { key: 'value' }.freeze