/
Evorunner
/
ruby_labs
Обзор
Документация
Войти
/
Evorunner
/
ruby_labs
Код
Запросы
4
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Lab5
Lab4/group_manager.rb
102 строки
3 KB
Иван
lab-04: работа с файлами, GroupManager и StudentRepository
31 май 2026, 17:34
31 май 2026, 17:34
64ef571
Код
Авторство
О чём код?
require_relative "student_repository" class GroupManager GROUPS_DIR = "groups" INDEX_FILE = "#{GROUPS_DIR}/_index.csv" # id,name GROUP_REGEX = /\A[a-zA-Zа-яА-ЯёЁ0-9\-_ ]+\z/ def initialize Dir.mkdir(GROUPS_DIR) unless Dir.exist?(GROUPS_DIR) File.write(INDEX_FILE, "") unless File.exist?(INDEX_FILE) end # Создать группу с уникальным именем def create(name) name = name.strip raise ArgumentError, "Некорректное название группы" unless valid_name?(name) raise ArgumentError, "Группа '#{name}' уже существует" if find_by_name(name) id = next_id File.open(INDEX_FILE, "a") { |f| f.puts "#{id},#{name}" } group_file = file_path(id) File.write(group_file, "") unless File.exist?(group_file) { id: id, name: name } end # Найти группу по ID def find(id) all_groups.find { |g| g[:id] == id.to_i } end # Удалить группу по ID def delete(id) id = id.to_i group = find(id) raise ArgumentError, "Группа с ID #{id} не найдена" unless group File.delete(file_path(id)) if File.exist?(file_path(id)) groups = all_groups.reject { |g| g[:id] == id } rewrite_index(groups) group end # Поиск по паттерну имени (подстрока, без учёта регистра) def where(name_pattern) all_groups.select { |g| g[:name].downcase.include?(name_pattern.downcase) } end # Вывод всех групп со студентами def index(output: $stdout) groups = all_groups if groups.empty? output.puts "Групп нет." return end groups.each do |g| output.puts "\n[ID: #{g[:id]}] #{g[:name]}" repo = StudentRepository.new(file_path(g[:id])) students = repo.index if students.empty? output.puts " (студентов нет)" else students.each_with_index do |s, i| output.puts " #{i + 1}. #{s}" end end end end def file_path(id) "#{GROUPS_DIR}/group_#{id}.csv" end def all_groups return [] unless File.exist?(INDEX_FILE) File.readlines(INDEX_FILE).filter_map do |line| parts = line.chomp.split(",", 2) next if parts.size < 2 { id: parts[0].to_i, name: parts[1] } end end private def valid_name?(name) !name.empty? && name.match?(GROUP_REGEX) end def find_by_name(name) all_groups.find { |g| g[:name].downcase == name.downcase } end def next_id ids = all_groups.map { |g| g[:id] } ids.empty? ? 1 : ids.max + 1 end def rewrite_index(groups) File.open(INDEX_FILE, "w") do |f| groups.each { |g| f.puts "#{g[:id]},#{g[:name]}" } end end end