|
|
|
require_relative 'person'
|
|
|
|
|
|
|
|
class Student < Person
|
|
|
|
attr_accessor :surname, :name, :patronymic
|
|
|
|
|
|
|
|
def initialize(args = {})
|
|
|
|
super(args)
|
|
|
|
@surname = args.fetch(:surname)
|
|
|
|
raise ArgumentError, "Invalid surname format: #{@surname}" unless self.class.valid_name?(@surname)
|
|
|
|
|
|
|
|
@name = args.fetch(:name)
|
|
|
|
raise ArgumentError, "Invalid name format: #{@name}" unless self.class.valid_name?(@name)
|
|
|
|
|
|
|
|
@patronymic = args.fetch(:patronymic)
|
|
|
|
raise ArgumentError, "Invalid patronymic format: #{@patronymic}" unless self.class.valid_name?(@patronymic)
|
|
|
|
|
|
|
|
set_contacts(
|
|
|
|
phone: args[:phone],
|
|
|
|
telegram: args[:telegram],
|
|
|
|
email: args[:email]
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.from_string(student_string)
|
|
|
|
parts = student_string.split('|').map(&:strip)
|
|
|
|
surname, name, patronymic = parts[0].split(' ')
|
|
|
|
id = parts[1].split(': ').last.to_i
|
|
|
|
phone = parts[2].split(': ').last
|
|
|
|
telegram = parts[3].split(': ').last
|
|
|
|
email = parts[4].split(': ').last
|
|
|
|
git = parts[5].split(': ').last
|
|
|
|
|
|
|
|
new(
|
|
|
|
surname: surname,
|
|
|
|
name: name,
|
|
|
|
patronymic: patronymic,
|
|
|
|
id: id,
|
|
|
|
phone: phone,
|
|
|
|
telegram: telegram,
|
|
|
|
email: email,
|
|
|
|
git: git
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.read_from_txt(file_path)
|
|
|
|
raise IOError, "File path is invalid or 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 = 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)
|
|
|
|
raise ArgumentError, "Expected an array of Student objects" unless students.is_a?(Array) && students.all? { |s| s.is_a?(Student) }
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
def surname_and_initials
|
|
|
|
"#{@surname} #{name[0]}.#{patronymic[0]}."
|
|
|
|
end
|
|
|
|
|
|
|
|
def to_s
|
|
|
|
"#{@surname} #{@name} #{@patronymic} | ID: #{@id || 'N/A'} | " \
|
|
|
|
"Phone: #{@phone || 'N/A'} | Telegram: #{@telegram || 'N/A'} | " \
|
|
|
|
"Email: #{@email || 'N/A'} | Git: #{@git || 'N/A'}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_info
|
|
|
|
"#{surname_and_initials}, Git: #{git_info}, Contact: #{contact_info}"
|
|
|
|
end
|
|
|
|
end
|