#!/usr/bin/env ruby
require "json"
require "net/http"
require "uri"
class User
attr_accessor :id, :name, :email, :active
def initialize(id:, name:, email:, active: true)
@id = id
@name = name
@email = email
@active = active
end
def to_s
"#{@name} <#{@email}>"
end
def active?
@active
end
def deactivate!
@active = false
end
end
class UserRepository
def initialize
@users = {}
end
def add(user)
@users[user.id] = user
end
def find(id)
@users[id]
end
def find_by_email(email)
@users.values.find { |u| u.email == email }
end
def active_users
@users.values.select(&:active?)
end
def each(&block)
@users.values.each(&block)
end
def to_json(*args)
@users.values.map(&:to_h).to_json(*args)
end
end
def fetch_users(url)
uri = URI.parse(url)
response = Net::HTTP.get_response(uri)
raise "HTTP error: #{response.code}" unless response.is_a?(Net::HTTPSuccess)
JSON.parse(response.body)
rescue StandardError => e
warn "Failed to fetch users: #{e.message}"
[]
end
def process_items(items)
items.map { |item| yield item }
end
repo = UserRepository.new
repo.add(User.new(id: 1, name: "Alice", email: "alice@example.com"))
repo.each do |user|
puts user.to_s
end
puts "Active: #{repo.active_users.size}"