programs/data_pipeline/data_pipeline.rb
tests/_examples/programs/data_pipeline/data_pipeline.rb in the metorex repository.
# Data Processing Pipeline: Process a list of student records
# Demonstrates: arrays, hashes, iteration, filtering, mapping
# Student data as hashes
students = [
{"name" => "Alice", "grade" => 92, "subject" => "Math"},
{"name" => "Bob", "grade" => 78, "subject" => "Science"},
{"name" => "Charlie", "grade" => 95, "subject" => "Math"},
{"name" => "Diana", "grade" => 88, "subject" => "Science"},
{"name" => "Eve", "grade" => 67, "subject" => "Math"},
{"name" => "Frank", "grade" => 91, "subject" => "Science"}
]
# Step 1: Filter passing students (grade >= 70)
passing = students.filter do |s|
s["grade"] >= 70
end
puts "Passing students:"
passing.each do |s|
puts " #{s["name"]}: #{s["grade"]}"
end
# Step 2: Get names of honor roll students (grade >= 90)
honor_roll = students.filter do |s|
s["grade"] >= 90
end
puts "Honor roll:"
honor_roll.each do |s|
puts " #{s["name"]}: #{s["grade"]}"
end
# Step 3: Calculate average grade
total = 0
students.each do |s|
total += s["grade"]
end
average = total.to_f / students.length
puts "Average grade: #{average}"
# Step 4: Count students per subject
math_count = 0
science_count = 0
students.each do |s|
if s["subject"] == "Math"
math_count += 1
else
science_count += 1
end
end
puts "Math students: #{math_count}"
puts "Science students: #{science_count}"
# Step 5: Extract just the names
names = students.map do |s|
s["name"]
end
puts "All students: #{names}"
Output:
Passing students:
Alice: 92
Bob: 78
Charlie: 95
Diana: 88
Frank: 91
Honor roll:
Alice: 92
Charlie: 95
Frank: 91
Average grade: 85.16666666666667
Math students: 3
Science students: 3
All students: ["Alice", "Bob", "Charlie", "Diana", "Eve", "Frank"]