Краткое описание процедуры сдачи

Задача будет выдана на ограниченное время, равное трём часам. Формат сдачи можно сравнить с обыкновенной контрольной по математическим предметам.

Текст задачи будет размещён на данной странице, а решение необходимо будет предоставить на ресурс moodle.uniyar.ac.ru. Пожалуйста удостоверьтесь, что у вас есть доступ к данному ресурсу.

Результат работы - архив с исходными кодами, который прикрепляется как решение задачи.

Требования к знаниям учащихся

  • Уровень знакомства с синтаксисом языка Ruby:
    • Запуск приложения.
    • Переменные, методы.
    • Работа контейнерами, итераторами, нумераторами.
    • Описание собственных классов.
    • Наследование классов.
    • Использование модулей и примесей.
    • Знание деталей работы чисел.
    • Знание деталей вызова методов и указания их аргументов.
    • Использование методов чисел и промежутков.
    • Использование методов классов строк и регулярных выражений.
  • Уровень знакомства с экосистемой Ruby:
    • Установка, удаление зависимостей с помощью gem.
    • Управление зависимостями с помощью Bundler.
    • Проверка качества исходного кода с помощью Rubocop.
    • Запуск типичных задач разработчика с помощью Rake.
  • Уровень знакомства с разработкой веб-приложений с помощью библиотеки Roda:
    • Обработка запросов GET для получения данных.
    • Использование шаблонов Foundation / Bootstrap для оформления сайта.
    • Обработка запросов POST на редактирование данных.
    • Передача аргументов в контроллер через адресную строку.
    • Умение структурировать сложное приложение.
    • Умение формировать интерфейс взаимодействия в стиле REST.

Требования к выполнению задания

  • Приложение должно реализовать все требования, указанные в задании. Однако к защите допускаются приложения, реализующие только часть задач.
  • К защите не допускается исходный код, который не запускается.
  • Исходный код приложения должен быть проверен с помощью приложения Rubocop с настройками по-умолчанию или с конфигурацией, предложенной на соответствующем занятии. Для каждого нарушения, которое находит Rubocop, должно быть объяснение почему оно не было исправлено. Допускаются аргументы с точки зрения архитектуры приложения, другого рода аргументы не принимаются.
  • Все зависимости приложения должны управляться с помощью Bundler, установка зависимостей с помощью gem запрещена. Исключением является джем bundler.
  • Для разрабатываемого приложения должны быть создан отдельный каталог.
    • В корне каталога должны располагаться конфигурационные файлы: Gemfile, Gemfile.lock.
    • В корне каталога приложения должны находится каталоги bin, lib, в которых должен находиться исходный код приложения. В каталоге bin находится исполняемый файл, в каталоге lib находится описание всех собственных классов и модулей.
  • Весь код приложения должен быть разбит на модули и классы, запрещается использовать файлы с простым набором методов, которые не пренадлежат какому-либо модулю.
  • Необходимо выделить отдельные классы, описывающие предметную область.
  • В одном модуле нельзя совмещать логику обработки предметной области и операции ввода-вывода.
  • Приложение должно корректно обрабатывать неправильный ввод от пользователя.
  • Приложение должно обладать понятным интерфейсом: показывать помощь по использованию, для ввода данных приложение должно показывать приглашение.

Задача

Разработать приложение, позволяющее вести журнал просмотренных видео роликов. Ролик определяется следующими полями: название видео, название канала, продолжительность видео.

  • Название видео и название канала не могут быть пустыми и вводятся как строки.
  • Продолжительность видео вводится в формате ММ:СС, например 12:35, и не может быть пустым.

Приложение должно предоставить командный интерфейс для решения следующих задач:

  • Добавление новой записи в журнал.

    Если пользователь ввёл данные некорректно, то приложение должно запросить их повторный ввод.

  • Просмотр всех записей в журнале по времени добавления в журнал.
  • Вычисление статистики по каналам: для каждого канала подсчитать количество просмотренных роликов и их среднюю продолжительность.

    Пользователь должен выбрать канал из списка. Список должен формироваться на основании данных, которые находятся в списке.

  • Вычисление статистики за указанный месяц:
    • количество просмотренных видео;
    • средняя продолжительность просмотренного видео;
    • количество уникальных посещённых каналов.

    При выборе данного пункта приложение должно показывать минимальный и максимальный месяц, за который доступны данные.

    Если за указанный пользователем месяц не добавлено ни одного видео, тогда среднее время просмотра должно быть равно 0.

    Если пользователь неправильно (технически) ввёл месяц, то необходимо ему об этом сообщить и попросить его ввести заново.

Требования к реализации

  • Необходимо использовать объектно-ориентированный подход при реализации приложения. Как минимум необходимо описать классы Video и VideoCollection.
  • Обработка логики по сортировке видео должна быть реализована силами класса VideoCollection. Желательно реализовать её через итераторы.
  • Рекомендуется реализовать считывание данных при старте приложения из файла.
  • Рекомендуется реализовать сохранение данных при завершении работы приложения.