You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kubsu-sm5-ruby/lab2/student_short.rb

87 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

require_relative 'person'
class StudentShort < Person
attr_reader :surname_initials, :contact
def initialize(student)
# Проверяем наличие необходимых методов и данных у student
raise ArgumentError, "Объект student не имеет метод id" unless student.respond_to?(:id)
raise ArgumentError, "Объект student не имеет метод git_info" unless student.respond_to?(:git_info)
raise ArgumentError, "Объект student не имеет метод surname_and_initials" unless student.respond_to?(:surname_and_initials)
raise ArgumentError, "Объект student не имеет метод contact_info" unless student.respond_to?(:contact_info)
super(id: student.id, git: student.git_info)
@surname_initials = student.surname_and_initials
raise ArgumentError, "Поле surname_initials не может быть пустым" if @surname_initials.nil? || @surname_initials.strip.empty?
# Дополнительная проверка на формат имен, если требуется
# Если формат @surname_initials может быть сложным (например, "Иванов И.И."),
# то можно добавить отдельную проверку формата:
unless valid_surname_initials?(@surname_initials)
raise ArgumentError, "Некорректный формат фамилии и инициалов: #{@surname_initials}"
end
@contact = student.contact_info
raise ArgumentError, "Контактная информация не может быть пустой" if @contact.nil? || @contact.strip.empty?
end
def self.from_string(id, info_string)
raise ArgumentError, "info_string не может быть пустой" if info_string.nil? || info_string.strip.empty?
parts = info_string.split(', ').map(&:strip)
# Ожидается три части: Фамилия и инициалы, Git, Контакт
unless parts.size == 3
raise ArgumentError, "Строка info_string должна содержать три части разделённые запятой: '#{info_string}'"
end
surname_initials = parts[0]
raise ArgumentError, "Не удалось извлечь фамилию и инициалы" if surname_initials.nil? || surname_initials.empty?
git_part = parts[1]
raise ArgumentError, "Не удалось извлечь Git-данные" if git_part.nil? || !git_part.include?(': ')
git = git_part.split(': ').last
raise ArgumentError, "Некорректная строка для Git: '#{git_part}'" if git.nil? || git.empty?
contact_part = parts[2]
raise ArgumentError, "Не удалось извлечь контактные данные" if contact_part.nil? || !contact_part.include?(': ')
contact = contact_part.split(': ').last
raise ArgumentError, "Некорректная строка для контакта: '#{contact_part}'" if contact.nil? || contact.empty?
new_instance = allocate
new_instance.send(:initialize_from_data, id, surname_initials, git, contact)
new_instance
end
private
def initialize_from_data(id, surname_initials, git, contact)
raise ArgumentError, "ID должен быть числом" if id && !id.is_a?(Integer)
@id = id
@surname_initials = surname_initials
raise ArgumentError, "Поле surname_initials не может быть пустым" if @surname_initials.nil? || @surname_initials.strip.empty?
unless valid_surname_initials?(@surname_initials)
raise ArgumentError, "Некорректный формат фамилии и инициалов: #{@surname_initials}"
end
@git = git
raise ArgumentError, "Git ссылка не может быть пустой" if @git.nil? || @git.strip.empty?
raise ArgumentError, "Некорректная ссылка на GitHub: #{@git}" unless self.class.valid_git?(@git)
@contact = contact
raise ArgumentError, "Контактная информация не может быть пустой" if @contact.nil? || @contact.strip.empty?
# Инициализация родительского класса для валидации полей
# Если необходимо, можно повторно вызвать super или же доверять валидации из Person при отдельном создании
# В данном случае super уже вызывается в инициализаторе, а тут мы лишь готовим данные.
end
def valid_surname_initials?(string)
# Пример простой проверки: фамилия и инициалы могут содержать буквы и точки.
# Формат: "Иванов И.И." или "Petrov P.P."
# Условно: первая часть - фамилия, затем инициалы через пробел.
# Можно настроить по необходимости.
string.match?(/\A[А-Яа-яЁёA-Za-z]+(\s+[А-Яа-яЁёA-Za-z]\.[А-Яа-яЁёA-Za-z]\.)?\z/)
end
end