|
#!/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}"
|