/
Evorunner
/
ruby_labs
Обзор
Документация
Войти
/
Evorunner
/
ruby_labs
Код
Запросы
4
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Lab5
Lab4/main.rb
193 строки
6 KB
Иван
lab-04: работа с файлами, GroupManager и StudentRepository
31 май 2026, 17:34
31 май 2026, 17:34
64ef571
Код
Авторство
О чём код?
require_relative "group_manager" require_relative "student_repository" require_relative "student" # Вспомогательные функции ввода def prompt(msg) print msg gets.chomp.strip end def prompt_until_valid(msg, type = :string) loop do print msg raw = gets.chomp.strip value = type == :integer ? (Integer(raw) rescue nil) : raw if value && yield(value) return value else puts "Ошибка: введите корректное значение!" end end end def input_student(group_name) name = prompt_until_valid(" Имя: ") { |v| !v.empty? } age = prompt_until_valid(" Возраст: ", :integer) { |v| v > 0 } gender = prompt_until_valid(" Пол (male/female): ") { |v| Student::VALID_GENDERS.include?(v.downcase) } email = prompt_until_valid(" Email: ") { |v| v.match?(Student::EMAIL_REGEX) } skills = {} count = prompt_until_valid(" Сколько навыков? ", :integer) { |v| v >= 0 } count.times do sname = prompt_until_valid(" Навык: ") { |v| !v.empty? }.to_sym slevel = prompt_until_valid(" Уровень (#{Student::VALID_SKILL_LEVELS.join('/')}): ") do |v| Student::VALID_SKILL_LEVELS.include?(v.downcase) end skills[sname] = slevel.downcase end Student.new(name: name, age: age, gender: gender.downcase, group: group_name, email: email, skills: skills) end # Работа с группами def handle_groups(gm) puts "\nКоманды: create, find, delete, where, index, exit" loop do cmd = prompt("groups> ").downcase case cmd when "create" name = prompt("Название группы: ") begin g = gm.create(name) puts "Создана группа [ID: #{g[:id]}] #{g[:name]}" rescue ArgumentError => e puts "Ошибка: #{e.message}" end when "find" id = prompt("ID группы: ") g = gm.find(id) g ? puts("[ID: #{g[:id]}] #{g[:name]}") : puts("Группа не найдена") when "delete" id = prompt("ID группы: ") begin g = gm.delete(id) puts "Удалена группа [ID: #{g[:id]}] #{g[:name]}" rescue ArgumentError => e puts "Ошибка: #{e.message}" end when "where" pattern = prompt("Паттерн имени: ") results = gm.where(pattern) results.empty? ? puts("Ничего не найдено") : results.each { |g| puts "[ID: #{g[:id]}] #{g[:name]}" } when "index" gm.index when "exit" puts "Выход." exit else puts "Неизвестная команда. Попробуй: create, find, delete, where, index, exit" end end end # Работа со студентами def handle_students(gm) id = prompt("ID группы: ") group = gm.find(id) unless group puts "Группа не найдена." return end repo = StudentRepository.new(gm.file_path(group[:id])) puts "\nГруппа: #{group[:name]}" puts "Команды: index, find, where, create, update, delete, exit" loop do cmd = prompt("students/#{group[:name]}> ").downcase case cmd when "index" students = repo.index students.empty? ? puts("Студентов нет") : students.each_with_index { |s, i| puts "#{i + 1}. #{s}" } when "find" sid = prompt("ID студента: ") s = repo.find(sid) s ? puts(s) : puts("Студент не найден") when "where" puts "Параметры поиска (оставь пустым чтобы пропустить):" params = {} name = prompt(" Имя: "); params[:name] = name unless name.empty? age = prompt(" Возраст: "); params[:age] = age.to_i unless age.empty? gender = prompt(" Пол: "); params[:gender] = gender unless gender.empty? email = prompt(" Email: "); params[:email] = email unless email.empty? results = repo.where(**params) results.empty? ? puts("Ничего не найдено") : results.each { |s| puts s } when "create" student = input_student(group[:name]) begin s = repo.create(student) puts "Добавлен студент [ID: #{s.id}] #{s.name}" rescue ArgumentError => e puts "Ошибка: #{e.message}" end when "update" sid = prompt("ID студента: ") puts "Введи новые данные (оставь пустым чтобы не менять):" data = {} name = prompt(" Имя: "); data[:name] = name unless name.empty? age = prompt(" Возраст: "); data[:age] = age.to_i unless age.empty? gender = prompt(" Пол: "); data[:gender] = gender.downcase unless gender.empty? email = prompt(" Email: "); data[:email] = email unless email.empty? begin s = repo.update(sid, data) puts "Обновлён студент [ID: #{s.id}] #{s.name}" rescue ArgumentError => e puts "Ошибка: #{e.message}" end when "delete" sid = prompt("ID студента: ") begin s = repo.delete(sid) puts "Удалён студент [ID: #{s.id}] #{s.name}" rescue ArgumentError => e puts "Ошибка: #{e.message}" end when "exit" puts "Выход." exit else puts "Неизвестная команда. Попробуй: index, find, where, create, update, delete, exit" end end end # Главный цикл gm = GroupManager.new puts "Менеджер студентов" loop do puts "\nС чем работаем?" puts " groups - управление группами" puts " students - управление студентами в группе" puts " exit - выход" choice = prompt("> ").downcase case choice when "groups" then handle_groups(gm) when "students" then handle_students(gm) when "exit" puts "Выход." break else puts "Введи 'groups', 'students' или 'exit'" end end