commit
c222d7bdd0
@ -0,0 +1,67 @@
|
|||||||
|
class Contact
|
||||||
|
attr_reader :phone, :telegram, :email
|
||||||
|
|
||||||
|
def initialize(phone: nil, telegram: nil, email: nil)
|
||||||
|
@phone = phone
|
||||||
|
@telegram = telegram
|
||||||
|
@email = email
|
||||||
|
validate_contacts
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid_phone_number?
|
||||||
|
return true if @phone.nil?
|
||||||
|
|
||||||
|
/\A\+?[0-9]{10,15}\z/.match?(@phone)
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid_telegram?
|
||||||
|
return true if @telegram.nil?
|
||||||
|
|
||||||
|
/\A@[A-Za-z0-9_]{5,32}\z/.match?(@telegram)
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid_email?
|
||||||
|
return true if @email.nil?
|
||||||
|
|
||||||
|
/\A[^@\s]+@[^@\s]+\.[^@\s]+\z/.match?(@email)
|
||||||
|
end
|
||||||
|
|
||||||
|
def present?
|
||||||
|
@phone || @telegram || @email
|
||||||
|
end
|
||||||
|
|
||||||
|
def info
|
||||||
|
return "Phone: #{@phone}" if @phone
|
||||||
|
return "Telegram: #{@telegram}" if @telegram
|
||||||
|
return "Email: #{@email}" if @email
|
||||||
|
|
||||||
|
'No contact available'
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def validate_contacts
|
||||||
|
if !present?
|
||||||
|
raise ArgumentError, 'At least one contact (phone, telegram, or email) is required'
|
||||||
|
end
|
||||||
|
|
||||||
|
raise ArgumentError, "Invalid phone number format: #{@phone}" if @phone && !valid_phone_number?
|
||||||
|
raise ArgumentError, "Invalid telegram format: #{@telegram}" if @telegram && !valid_telegram?
|
||||||
|
raise ArgumentError, "Invalid email format: #{@email}" if @email && !valid_email?
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.new_from_info(info_string)
|
||||||
|
info_string = info_string.sub(/^Contact: /, '').strip
|
||||||
|
|
||||||
|
case info_string
|
||||||
|
when /\APhone: (.+)\z/i
|
||||||
|
new(phone: Regexp.last_match(1).strip)
|
||||||
|
when /\ATelegram: (.+)\z/i
|
||||||
|
new(telegram: Regexp.last_match(1).strip)
|
||||||
|
when /\AEmail: (.+)\z/i
|
||||||
|
new(email: Regexp.last_match(1).strip)
|
||||||
|
else
|
||||||
|
raise ArgumentError, "Invalid contact info format: #{info_string}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,39 @@
|
|||||||
|
require_relative 'student'
|
||||||
|
|
||||||
|
class StudentRepository
|
||||||
|
def self.read_from_txt(file_path)
|
||||||
|
raise IOError, "File does not exist: #{file_path}" unless File.exist?(file_path)
|
||||||
|
|
||||||
|
students = []
|
||||||
|
|
||||||
|
File.foreach(file_path) do |line|
|
||||||
|
line.strip!
|
||||||
|
next if line.empty?
|
||||||
|
|
||||||
|
begin
|
||||||
|
student = Student.from_string(line)
|
||||||
|
students << student
|
||||||
|
rescue ArgumentError => e
|
||||||
|
puts "Error processing line: '#{line}'. Reason: #{e.message}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
students
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.write_to_txt(file_path, students)
|
||||||
|
unless students.is_a?(Array) && students.all? { |s| s.is_a?(Student) }
|
||||||
|
raise ArgumentError, 'Expected an array of Student objects'
|
||||||
|
end
|
||||||
|
|
||||||
|
File.open(file_path, 'w') do |file|
|
||||||
|
students.each do |student|
|
||||||
|
file.puts student.to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Data successfully written to #{file_path}"
|
||||||
|
rescue IOError => e
|
||||||
|
puts "An error occurred while writing to the file: #{e.message}"
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,3 @@
|
|||||||
|
Иванов Иван Иванович | ID: 1 | Phone: +12345678901 | Telegram: @ivanov_user | Email: ivanov@example.com | Git: https://github.com/ivanov
|
||||||
|
Петров Петр Петрович | ID: 2 | Phone: +98765432101 | Telegram: @petrov_user | Email: petrov@example.com | Git: https://github.com/petrov
|
||||||
|
Сидоров Сидор Сидорович | ID: 3 | Phone: +56789012345 | Telegram: @sidorov_user | Email: sidorov@example.com | Git: https://github.com/sidorov
|
Loading…
Reference in new issue