contest.rb - 1um/ejudge-on-rails GitHub Wiki

Данная модель динамически парсит папки в EJUDGE_PATH. Имеет следующие поля:

  • path - Обьект класса Pathname - путь к папке с контестом.
  • settings - ассоциативный массив, с параметрами контеста. Исходный код - /app/models/contest.rb

Принцип работы:

В отличии от большинства привычных нам моделей - эта не взаимодействует с БД. Именно для этого нам нужно написать: include ActiveModel::Validations include ActiveModel::Conversion extend ActiveModel::Naming И переопределить методы: def persisted? def initialize(attributes = {})

Так откуда же берутся данные?

Весь секрет в методе self.all, который смотрит на все папки внутри judges_path и если их имя - сплошные цифры - то перед нами папка с контестом.

Переменная settings заполняется методом reload_settings, который вызывется из initialize метода. Он в папке контеста находит файл /conf/serve.cfg и парсит его, превращая в хеш. Обратно он пока не умеет.

Поля

Как уже говоилось, поле Path - это обьект класса PathName - хранит абсолютный путь до директории с конестом. А вот поле settings - более интересное. Это поле - сложенная структура данных:

  • settings[:common] - хеш общих настроек
  • settings["language"] - массив с настройками разных языков программирования.
  • settings["problem"] - хеш с настройками задач, где в качестве ключей - id задачи. //могут быть любые блоки, если они соответствуют формату конфигурационного файла.

Методы

def self.all - возвращает массив со всеми обьектами класса Contest, которые есть в папке Judges_path.

def self.find name - находит контест по его названию.

def tasks - возвращает массив объектов класса Task, которые принадлежат данному контесту

def name, def id - название конетста (только цифры могут быть).

def reload_settings - парсит /conf/serve.cfg и заполняет settings.

def structurize_problem_settings before - вспомогательный метод reload_settings. Делает settings["problem"] - хешем, где в качестве ключей используется id задачи.

def initialize(attributes = {}) - конструктор. Вызывет метод reload_settings

def sid - возвращает session id текущей сессии в оригинальном ejudge для этого контеста.

def unstaged_changes? - возвращает true если внесенные изменения еще не применились на сервере.

def save - не работющий (пока) метод конвертации settings в /conf/serve.cfg

Примеры использования:

Contest.find("101").tasks - все задачи контеста 101.

Contest.all.map(&:name) - массив названий всех контестов.

⚠️ **GitHub.com Fallback** ⚠️