Требования к лабораторной работе

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

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

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

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

Требования к формату сдачи

Каталог приложения с исходным кодом должен быть загружен в качестве ответа на задание в Moodle.

Задача

Написать веб-приложение, моделирующее работу читательского дневника.

Данное приложение должно быть реализовано на основе программы для предыдущей лабораторной работы. Изменения в требованиях к лабораторной работе показаны текстом на жёлтом фоне.

Приложение должно выполнять следующие функции:

  1. Отображение списка всех прочитанных книг.

    Список всех прочитанных книг должен быть упорядочен по убыванию даты прочтения и отображаться в таблице со столбцами:

    • Дата прочтения;
    • Автор «Название»;
    • Оценка;
    • Формат чтения.

    На странице должна быть возможность отфильтровать список по формату чтения.

  2. Добавление новой записи о прочтении книги.

    Пользователь заполняет форму с информацией о книге:

    • Автор произведения;
    • Название произведения;
    • Дата прочтения;
    • Формат чтения:
      • бумажная книга;
      • электронная книга;
      • аудиокнига;
    • Размер произведения:
      • количество страниц для бумажной книги;
      • количество символов в электронной книге;
      • длительность аудиокниги;
    • Оценка по 10-балльной шкале;
    • Необязательный текстовый комментарий.

    Заполнив все поля, пользователь нажимает кнопку «Сохранить». Перед сохранением приложение должно проверить корректность введённых данных:

    • Поля автора и названия не пусты;
    • Дата прочтения записана в формате ГГГГ-ММ-ДД и является существующей датой (в году 12 месяцев, в месяце 31 день);
    • Выбран ровно один формат чтения и для него корректно заполнено соответствующее поле о размере произведения:
      • количество страниц для бумажной книги является натуральным числом;
      • количество символов в электронной книге является натуральным числом;
      • длительность аудиокниги записана в формате h:mm:ss (h – любое натуральное количество часов, mm и ss – количество минут и секунд соответственно от 0 до 60, записанное двумя символами).
    • Оценка является целым числом от 0 до 10;
    • Текстовый комментарий содержит не более 2000 символов.

    Если введённые данные не корректны, приложение должно вывести пользователю соответствующее сообщение, указав какие именно поля заполнены неверно и какая ошибка допущена. Введённые пользователем данные не должны потеряться.

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

  3. Отображение статистики чтения за год.

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

    После выбора отчётного года приложение отображает информацию за весь год, сгруппированную по месяцам. Для каждого месяца выводится:

    • Количество прочитанных книг.
    • Средняя оценка за месяц.
    • Среднее количество страниц за месяц. Для электронных книг считать, что на одной странице в среднем 1500 символов. Для аудиокниги считать, что одна страница в среднем начитывается за 120 секунд.
  4. Отображение списка любимых книг.

    На странице требуется вывести список всех книг с наивысшей оценкой, упорядоченный по убыванию даты. Список должен содержать автора и название произведения, дату прочтения и текстовый комментарий, если он есть.

    Наивысшая оценка — это максимальная оценка, которую поставил пользователь хотя бы одной книге. Если таких книг больше 10, вывести только 10 самых новых книг.